sql >> データベース >  >> RDS >> PostgreSQL

Postgres関数で一時テーブルを削除できません:このセッションでアクティブなクエリによって使用されています

    エラーメッセージはかなり明白です。使用中に一時テーブルを削除することはできません。

    ON COMMIT DROPを追加すると、問題を回避できる場合があります。 :

    ただし、これはおそらくもっと簡単な場合があります。 必要がない場合 そもそもこれらすべての一時テーブル(私が思うに)は、それらすべてをCTE(またはおそらくそれらのほとんどはより安価なサブクエリ)に置き換えて、1つの大きなクエリに単純化することができます。 plpgsqlまたは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;
    

    ビューは、実際の結果の値(「スープ」)ではなく、クエリ(「レシピ」)を格納しているだけです。

    通常、一時テーブルを作成する代わりにCTEを使用する方が安価です。
    クエリで派生テーブル 、典型的な全体的なパフォーマンスでソートされます(インデックスを含む特別な場合を除く)。遅いものから速いものへ:

    CREATE TABLE
    CREATE UNLOGGED TABLE
    CREATE TEMP TABLE
    CTE
    subquery
    

    UNION 重複する行を折りたたむことを試みます。通常、人々は本当にUNION ALLを望んでいます 、行を追加するだけです。より速く、重複を削除しようとはしません。




    1. zendフレームワークは3つのテーブルを結合します

    2. SQL Server:日付範囲の計算

    3. OracleでAUTO_INCREMENTを使用してIDを作成するにはどうすればよいですか?

    4. 動的SQL-EXEC(@SQL)とEXEC SP_EXECUTESQL(@SQL)