Selon les autres commentaires, la deuxième expression de table commune [CTE] est précédée d'une virgule et non d'une instruction WITH, donc
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
En ce qui concerne votre requête réelle, cette syntaxe devrait fonctionner dans PostgreSql, Oracle et sql-server, et plus tard, vous procéderez généralement WITH
avec un point-virgule (;WTIH
), mais c'est parce que généralement les gens de sql-server (moi y compris) ne terminent pas les instructions précédentes qui doivent être terminées avant qu'un CTE ne soit défini...
Notez cependant que vous avez eu un deuxième problème de syntaxe en ce qui concerne votre WHERE
déclaration. WHERE date IN table_2
n'est pas valide car vous ne faites jamais référence à une valeur/colonne de table_2. Je préfère INNER JOIN
sur IN
ou Exists
voici donc une syntaxe qui devrait fonctionner avec 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
;
Si vous souhaitez conserver la manière dont vous l'aviez, EXISTS serait généralement préférable à IN, mais pour utiliser IN, vous avez besoin d'une instruction SELECT réelle dans votre where.
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
IN est très problématique lorsque date
pourrait potentiellement être NULL
donc si vous ne voulez pas utiliser un JOIN
alors je suggérerais EXISTS
. COMME suit :
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);