1. ホーム
  2. sql

[解決済み] 1つのPostgreSQLクエリで複数のWITHステートメントを使用するには?

2022-03-16 02:32:23

質問

私は、WITHステートメントを使用して、事実上複数のTEMPテーブルを宣言したいと思います。 私が実行しようとしているクエリは、次のようなものです。

WITH table_1 AS (
SELECT GENERATE_SERIES('2012-06-29', '2012-07-03', '1 day'::INTERVAL) AS date
)

WITH table_2 AS (
SELECT GENERATE_SERIES('2012-06-30', '2012-07-13', '1 day'::INTERVAL) AS date
)

SELECT * FROM table_1
WHERE date IN table_2

私が読んだのは PostgreSQLのドキュメント を複数使用することを研究しています。 WITH という文がありますが、答えが見つかりませんでした。

どのように解決するのですか?

他のコメントで、2つ目のCommon Table Expression [CTE]の前にコンマがあり、WITHステートメントではありません。

WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
    cte1 c1
    INNER JOIN cte2 c2
    ON ........

実際のクエリでは、この構文はPostgreSql、Oracle、sql-serverで動作するはずですが、後者の方が一般的でしょう。 WITH にセミコロン( ;WTIH しかし、これは、一般的なSQLサーバーの人々(私も含めて)が、CTEが定義される前に終了させる必要がある前のステートメントを終了させないためです...

しかし、あなたは2つ目の構文上の問題があったことに注意してください。 WHERE という文があります。 WHERE date IN table_2 は有効ではありません。なぜなら、実際には table_2 から値やカラムを参照していないからです。 私は INNER JOIN オーバー IN または Exists で動作する構文です。 JOIN :

WITH table_1 AS (
SELECT GENERATE_SERIES('2012-06-29', '2012-07-03', '1 day'::INTERVAL) AS date
)

, table_2 AS (
SELECT GENERATE_SERIES('2012-06-30', '2012-07-13', '1 day'::INTERVAL) AS date
)

SELECT * 
FROM
     table_1 t1
     INNER JOIN 
     table_2 t2
     ON t1.date = t2.date
;

EXISTSを使用する場合は、Whereに実際のSELECTステートメントを記述する必要があります。

SELECT * 
FROM
     table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);

の場合、IN は非常に問題です。 date になる可能性があります。 NULL ということで、もしあなたが JOIN であれば、私は EXISTS . ASは以下の通りです。

SELECT * 
FROM
     table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);