2016-07-01 5 views
22

WITHステートメントを使って効果的に複数のTEMPテーブルを宣言したいと思います。私が実行しようとしています クエリはのラインに沿っている:1つのPostgreSQLクエリで複数のWITH文を使用するには?

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 documentationを読み、研究し、複数のWITHステートメントを使用してにし、答えを見つけることができませんでしたしました。この構文は、PostgreSQL、Oracle、およびSQLで動作するはずです、あなたの実際のクエリの観点から

+0

2番目の 'with'ステートメントの前にコンマを試してください。 postgresについてはわかりませんが、それはOracleとSQL Serverの通常の構文です – mo2

+0

カンマとそれ以降のセミコロンを使用してみましたが、構文エラーが残っています: 'ERROR:カンマの「WITH」とか' ERROR:セミコロンの場合は ";"で構文エラーが発生します。 – Greg

答えて

39
文のWITH第2の共通テーブル式[CTE]はカンマによって先行される他のコメントパー

ないので

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

;WTIH)を使ってWITHを処理しますが、これは、通常はSQL Serverのユーザー(自分自身が含む)が、CTEを定義する前に終了する必要のある前のステートメントを終了しないためです。 。

しかし、あなたは2番目の構文上の問題がありましたur WHERE声明。 WHERE date IN table_2は、table_2から値/列を実際に参照することがないため、無効です。あなたが一般的に存在する、それがあった方法を保持する場合に比べて良いだろう

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またはExistsINNER JOINJOINで動作するはず構文れる好みます実際のSELECT文が必要です。

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

あなたはJOIN、私はEXISTSを示唆しているを使用しない場合dateは潜在的にとてもNULLことができたときにINは非常に問題です。次のようになります。

+0

深い説明ありがとう、構文は働いた:) – Greg

+0

助けてうれしい。私はINを使用しない記事を見つけることができませんが、INを介してJOINまたはEXISTSを使用することを強くお勧めします。あなたの結果セットにnullが存在する場合、あなたはあなたが望むものだけでなくすべてのレコードを得るでしょう。それは変ですが、ほとんどのRDBMが動作する方法です。それについての調査を試してみてください、私はそれについても見た良い答えを知っていますこのサイトでも...とにかく、良い夜を持って – Matt

+0

あなたは私に多くの時間の男を保存しました、ありがとう! – Juan

関連する問題