Zgodnie z innymi komentarzami drugie wspólne wyrażenie tabelowe [CTE] jest poprzedzone przecinkiem, a nie instrukcją WITH, więc
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
Jeśli chodzi o twoje aktualne zapytanie, ta składnia powinna działać w PostgreSql, Oracle i sql-server, cóż później zwykle będziesz kontynuował WITH ze średnikiem (;WTIH ), ale dzieje się tak dlatego, że zazwyczaj użytkownicy serwera sql (w tym ja) nie kończą poprzednich instrukcji, które muszą zostać zakończone przed zdefiniowaniem CTE...
Pamiętaj jednak, że miałeś drugi problem ze składnią w odniesieniu do Twojego WHERE oświadczenie. WHERE date IN table_2 jest nieprawidłowa, ponieważ nigdy nie odwołujesz się do wartości/kolumny z tabeli_2. Wolę INNER JOIN przez IN lub Exists więc oto składnia, która powinna działać z 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
;
Jeśli chcesz zachować to, co masz, które zazwyczaj EXISTS byłoby lepsze niż IN, ale aby użyć IN, potrzebujesz rzeczywistej instrukcji SELECT w swoim miejscu.
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
IN jest bardzo problematyczne, gdy date może potencjalnie być NULL więc jeśli nie chcesz używać JOIN wtedy sugerowałbym EXISTS . W następujący sposób:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);