我想使用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条语句,但没有找到答案.

推荐答案

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

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无效,因为您从未实际引用表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
;

如果您想保持它通常存在的方式,将比在中更好,但要在中使用,您需要在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);

Sql相关问答推荐

如何在T—SQL中找到值更改之前的日期?

SQL查询以条件空值跟踪生产操作结果进展

Select /过滤postgr中的树 struct

如何使用PostGIS从单个表中 Select 所有相交面组

如何退回当年的所有参赛作品?""

SQL查询:合并2个表

我如何计算字母a出现的字符串的次数?

使用Mac日志(log)时间找出SQL中的好小时和坏小时

如何在联接条件不匹配时按日期获取上一条记录

如何利用单列历史SQLsnowflake获得合并结果

判断序列索引处的序列是否完整

使用列表作为参数进行 Select ,如果为空,则在PostgreSQL中不使用参数进行 Select

在查询Oracle SQL中创建替代ID

基于是否具有某些数据的关联表覆盖SELECT语句中的列值

从输出中删除 jsonb_build_object

JSON_VALUE 不适用于提取的 json 中的嵌套路径

给定 3 个键列,从一个表中 Select 另一表中不存在的所有数据

当我返回 sql 列时,有没有办法只反转数字? ( hebrew )

根据是否存在值组合分组并 Select 行

并非所有变量都绑定在 PL SQL 函数中