根据其他注释,第二个公共表表达式[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
,而不是IN
或Exists
,所以这里有一个语法应该适用于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);