首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在一个PostgreSQL查询中使用多条WITH语句?

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

Stack Overflow用户
提问于 2016-07-01 12:01:44
回答 2查看 129K关注 0票数 128

我想使用WITH语句“声明”有效的多个临时表。我尝试执行的查询是这样的:

代码语言:javascript
复制
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语句,但无法找到答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-01 12:24:30

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

代码语言:javascript
复制
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
    cte1 c1
    INNER JOIN cte2 c2
    ON ........

就您的实际查询而言,此语法应该适用于PostgreSql、Oracle和sql-server,而后者通常会以分号(;WTIH)继续WITH,但这是因为通常sql-server人员(包括我自己)不会结束之前需要在定义CTE之前结束的语句...

但是请注意,与WHERE语句相关的还有第二个语法问题。WHERE date IN table_2无效,因为您从未实际引用过table_2中的值/列。我更喜欢INNER JOIN而不是INExists,因此以下语法适用于JOIN

代码语言:javascript
复制
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语句。

代码语言:javascript
复制
SELECT * 
FROM
     table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);

date可能是NULL时,IN是非常有问题的,所以如果你不想使用JOIN,那么我建议使用EXISTS。如下所示:

代码语言:javascript
复制
SELECT * 
FROM
     table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
票数 212
EN

Stack Overflow用户

发布于 2020-05-20 18:21:03

您还可以使用WITH语句链接您的结果。例如:

代码语言:javascript
复制
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;
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38136854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档