他のコメントによると、2番目の共通テーブル式[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-serverの人々(私自身を含む)が終了しないためです。 CTEが定義される前に終了する必要がある以前のステートメント...
ただし、WHERE
ステートメントに関して2番目の構文の問題があったことに注意してください。 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
;
通常は存在する方法を維持したい場合は、INよりも優れていますが、INを使用するには、whereに実際のSELECTステートメントが必要です。
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
INは非常に問題があるdate
可能性がある場合に問題が発生する可能性があるNULL
ため、を使用したくない場合はJOIN
、をお勧めしEXISTS
ます。次のように:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
with
ステートメントの前にコンマを、その後に他のステートメントを試してください。postgresについてはよく