Volgens de andere opmerkingen wordt de tweede Common Table Expression [CTE] voorafgegaan door een komma en niet door een WITH-instructie, dus
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
In termen van uw werkelijke vraag zou deze syntaxis moeten werken in PostgreSql, Oracle en sql-server, en hoe later u gewoonlijk verder gaat WITH met een puntkomma (;WTIH ), maar dat komt omdat mensen met een sql-server (waaronder ikzelf) geen einde maken aan eerdere instructies die moeten worden beëindigd voordat een CTE wordt gedefinieerd...
Merk echter op dat u een tweede syntaxisprobleem had met betrekking tot uw WHERE uitspraak. WHERE date IN table_2 is niet geldig omdat u nooit echt verwijst naar een waarde/kolom uit tabel_2. Ik geef de voorkeur aan INNER JOIN meer dan IN of Exists dus hier is een syntaxis die zou moeten werken met een 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
;
Als je wilt houden zoals je het had, wat normaal gesproken EXISTS beter zou zijn dan IN, maar om IN te gebruiken, heb je een echte SELECT-instructie nodig in je waar.
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
IN is erg problematisch wanneer date kan mogelijk NULL zijn dus als je geen JOIN wilt gebruiken dan zou ik EXISTS aanraden . ALS volgt:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);