sql >> Database >  >> RDS >> PostgreSQL

Kan tijdelijke tabel niet neerzetten in Postgres-functie:wordt gebruikt door actieve query's in deze sessie

De foutmelding is nogal voor de hand liggend, je kunt een tijdelijke tabel niet laten vallen terwijl deze in gebruik is.

U kunt het probleem mogelijk voorkomen door ON COMMIT DROP toe te voegen :

Dit kan echter waarschijnlijk eenvoudiger. Als u niet nodig al die tijdelijke tabellen om mee te beginnen (wat ik vermoed), je kunt ze allemaal vervangen door CTE's (of de meeste waarschijnlijk zelfs met goedkopere subquery's) en vereenvoudigen tot één grote query. Kan plpgsql of alleen SQL zijn:

CREATE FUNCTION everything(waypoints)
  RETURNS TABLE(node int, xy text[]) AS
$func$
   WITH bbox      AS (SELECT ... FROM waypoints)  -- not the fct. parameter!
    , b_spaces    AS (SELECT ... )
    , b_graph     AS (SELECT ... )
    , local_green AS (SELECT ... )
    , aug_temp    AS (SELECT ... )
    , b_graph2(source, target, cost) AS (
        SELECT ... FROM b_graph
        UNION ALL  -- guessing you really want UNION ALL
        SELECT ... FROM aug_temp
        UNION ALL 
        SELECT ... FROM aug_temp
       )
    , results     AS (SELECT id1, ... FROM b_graph2)
    , pkg         AS (SELECT loc, ... )
   SELECT id1, array_agg(loc) 
   FROM   pkg
   GROUP  BY id1
$func$ LANGUAGE sql;

Weergaven slaan alleen een zoekopdracht op ("het recept"), niet de werkelijke resulterende waarden ("de soep").

Het is doorgaans goedkoper om CTE's te gebruiken in plaats van tijdelijke tabellen te maken.
Afgeleide tabellen in query's , gesorteerd op hun typische algemene prestaties (uitzonderingen voor speciale gevallen met indexen). Van langzaam naar snel:

CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery

UNION zou proberen dubbele rijen te vouwen. Meestal willen mensen echt UNION ALL , die alleen rijen toevoegt. Sneller en probeert geen dupes te verwijderen.




  1. ik wil dit resultaat weergeven met codeigniter

  2. Wat zijn de zwakke punten van deze gebruikersauthenticatiemethode?

  3. Mysql-queryrelaties M-M-tabel

  4. Hoe het MySQL my.cnf-bestand te bewerken