Enligt de andra kommentarerna föregås det andra vanliga tabelluttrycket [CTE] av ett kommatecken inte ett WITH-uttryck så
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
När det gäller din faktiska fråga bör den här syntaxen fungera i PostgreSql, Oracle och sql-server, ju senare du vanligtvis fortsätter WITH
med semikolon (;WTIH
), men det beror på att sql-serverfolk (inklusive mig själv) vanligtvis inte avslutar tidigare uttalanden som måste avslutas innan en CTE definieras...
Observera dock att du hade ett andra syntaxproblem när det gäller din WHERE
påstående. WHERE date IN table_2
är inte giltig eftersom du aldrig faktiskt refererar till ett värde/kolumn från tabell_2. Jag föredrar INNER JOIN
över IN
eller Exists
så här är en syntax som borde fungera med en 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
;
Om du vill behålla hur du hade det, vilket vanligtvis EXISTERAR skulle vara bättre än IN men för att använda IN behöver du en faktisk SELECT-sats i din var.
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
IN är mycket problematiskt när date
kan potentiellt vara NULL
så om du inte vill använda en JOIN
då skulle jag föreslå EXISTS
. SOM följer:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);