Per gli altri commenti la seconda Common Table Expression [CTE] è preceduta da una virgola non da un'istruzione WITH quindi
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
In termini di query effettiva, questa sintassi dovrebbe funzionare in PostgreSql, Oracle e sql-server, in genere in seguito si procederà WITH
con un punto e virgola (;WTIH
), ma questo perché in genere le persone di sql-server (me compreso) non terminano le precedenti istruzioni che devono essere terminate prima che un CTE venga definito...
Nota, tuttavia, che hai avuto un secondo problema di sintassi per quanto riguarda il tuo WHERE
dichiarazione. WHERE date IN table_2
non è valido perché non si fa mai effettivamente riferimento a un valore/colonna da table_2. Preferisco INNER JOIN
su IN
o Exists
quindi ecco una sintassi che dovrebbe funzionare con un 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
;
Se vuoi mantenere il modo in cui lo avevi, che in genere EXISTS sarebbe meglio di IN, ma per usare IN hai bisogno di un'effettiva istruzione SELECT nel tuo dove.
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
IN è molto problematico quando date
potrebbe essere potenzialmente NULL
quindi se non vuoi usare un JOIN
quindi suggerirei EXISTS
. COME segue:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);