sql-如何在一个PostgreSQL查询中使用多个WITH语句?

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

Greg asked 2019-11-08T01:08:01Z
1个解决方案
96 votes

根据其他注释,第二个公共表表达式[CTE]前面是逗号而不是WITH语句,因此

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

就您的实际查询而言,此语法应在PostgreSql,Oracle和sql-server中起作用,那么以后通常您将使用分号(NULL)继续进行date,但这是因为通常sql-server人员(包括我自己)不这样做。 结束需要在定义CTE之前结束的先前语句...

但是请注意,关于2604454558952850850语句,您还有第二个语法问题。 NULL无效,因为您从未实际引用过table_2中的值/列。 与EXISTSExists相比,我更喜欢JOIN,因此这是一种应在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,则需要在实际位置使用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);
Matt answered 2019-11-08T01:08:46Z
translate from https://stackoverflow.com:/questions/38136854/how-to-use-multiple-with-statements-in-one-postgresql-query