我想使用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
语句,但是找不到答案。
根据其他注释,第二个公共表表达式[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
可能NULL
不愿意使用IN的时候,它非常成问题,JOIN
我建议EXISTS
。如下:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句