PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Nie można upuścić tabeli tymczasowej w funkcji Postgres:używana przez aktywne zapytania w tej sesji

Komunikat o błędzie jest dość oczywisty, nie można usunąć tabeli tymczasowej, gdy jest używana.

Możesz uniknąć problemu, dodając ON COMMIT DROP :

Jednak prawdopodobnie może to być prostsze. Jeśli nie potrzebujesz wszystkie te tabele tymczasowe (co podejrzewam), możesz zastąpić je wszystkie CTE (lub większość z nich prawdopodobnie nawet tańszymi podzapytaniami) i uprościć do jednego dużego zapytania. Może być plpgsql lub po prostu SQL:

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;

Widoki przechowują tylko zapytanie („przepis”), a nie rzeczywiste wartości wynikowe („zupa”).

Zwykle taniej jest używać CTE zamiast tworzyć tabele tymczasowe.
Tabele pochodne w zapytaniach , posortowane według ich typowej ogólnej wydajności (wyjątki dla szczególnych przypadków dotyczących indeksów). Od wolnego do szybkiego:

CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery

UNION spróbuje złożyć zduplikowane wiersze. Zazwyczaj ludzie naprawdę chcą UNION ALL , który po prostu dołącza wiersze. Szybciej i nie próbuje usuwać duplikatów.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyszukiwanie tablicy jsonb w PostgreSQL

  2. Jak przechwytywać rekordy błędów za pomocą JDBCTemplate batchUpdate w postgreSql?

  3. Jak zmienić użytkownika na superużytkownika w PostgreSQL?

  4. jOOQ EXTRACT(EPOCH Z [pole]) obejście?

  5. Jak ustawić wartość pola zmiennej złożonej za pomocą dynamicznego SQL?