簡體   English   中英

如何在一個 PostgreSQL 查詢中使用多個 WITH 語句?

[英]How to use multiple WITH statements in one PostgreSQL query?

我想使用 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語句,但無法找到答案。

根據其他評論,第二個公共表表達式 [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語句存在第二個語法問題。 WHERE date IN table_2無效,因為您從未實際引用 table_2 中的值/列。 我更喜歡INNER JOIN不是INExists所以這里的語法應該與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 會比 IN 更好,但要使用 IN,你需要在你的 where 中使用實際的 SELECT 語句。

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

date可能為NULL時, IN 非常有問題,因此如果您不想使用JOIN那么我建議EXISTS 如下:

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

您還可以使用 WITH 語句鏈接結果。 例如:

WITH tab1 as (Your SQL statement),
tab2 as ( SELECT ... FROM tab1 WHERE your filter),
tab3 as ( SELECT ... FROM tab2 WHERE your filter)
SELECT * FROM tab3;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM