1

私はかなり単純な宿題に取り組んでおり、いくつかの基準に準拠するデータを取得し、前のクエリで選択されたデータに対して別のクエリを実行する必要があります。

一時テーブルを作成し、最初のクエリの結果を入力してから、テーブルに対して 2 番目のクエリを実行します。それから私はテーブルを落とします。

問題は次のとおりです。テーブルを削除すると、結果が破棄されるため、2 番目のクエリは空になります。私はこれを理解していません。選択には一時テーブルを使用せず、データ検証のみに使用します。それでも、クエリの最後でテーブルが削除された場合、クエリは空を返します。テーブルを落とさなければ問題なく動作します。しかし、クエリを再度実行すると、テーブルが存在すると表示されます。ここで何が間違っていますか。コードは次のとおりです。

SELECT DISTINCT gno
INTO TEMPORARY TABLE TMP
FROM edge
WHERE weight>100;

SELECT  gname, gsum(graph.gno)
FROM TMP, graph
WHERE graph.gno = TMP.gno AND gsum(graph.gno)>=ALL
(SELECT gsum(graph.gno)
FROM graph);
4

1 に答える 1

0

一時テーブルは、各セッションに固有の特別な一時スキーマで作成されます。それらは同じセッションでのみ表示され、セッションが終了するまでのみ表示されます (以前にドロップされた場合を除く)。

その一時スキーマは暗黙的search_pathに(システム schema の後)の最初のスキーマであるpg_catalogため、同じ名前の他のテーブルを効果的に隠します。ドキュメントごと:

同じ名前の既存の永続テーブルは、スキーマ修飾名で参照されていない限り、一時テーブルが存在する間は現在のセッションには表示されません。

一時テーブルを削除すると、同じ名前の次のテーブルがsearch_path再び表示されます。gnoまた、そのテーブルの既存の列には一致する値がありません。したがって、結果は空です。

そのようなテーブルが存在しない場合、空の結果は得られず、次の試行でエラー メッセージが表示されるため、これは事実であるに違いありません。

また、2番目のクエリは次のようにする必要があります。

SELECT  gname, gsum(graph.gno)
FROM    tmp
JOIN    graph USING (gno)
WHERE   gsum(graph.gno) = (
   SELECT max(gsum(graph.gno))
   FROM   graph
   );

明示的なJOIN構文と簡略化されWHEREた条件。集計関数ではなく、単純な関数である
と仮定します。gsum()

于 2014-08-01T14:13:13.630 に答える