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);