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