根据其他注释,第二个公共表表达式[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
过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
;
如果要保持原样,通常EXISTS比IN更好,但是要使用IN,则需要在实际位置使用SELECT语句。
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
如果date
很可能出现INNULL
的JOIN
话,我会提出很大的问题EXISTS
。如下:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
with
语句之前,请尝试使用逗号。不确定postgres,但这是Oracle和sql server的常规语法