Conformément aux autres commentaires, la deuxième expression de tableau commune [CTE] est précédée d'une virgule et non d'une déclaration AVEC.
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
En ce qui concerne votre requête, cette syntaxe devrait fonctionner avec PostgreSql, Oracle et sql-server. WITH
avec un point-virgule ( ;WTIH
), mais c'est parce que les utilisateurs de serveurs SQL (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 aviez 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 la table_2. Je préfère INNER JOIN
plus 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 voulez garder la même façon de faire, c'est-à-dire EXISTS serait mieux que IN, mais pour utiliser IN, vous avez besoin d'une véritable instruction SELECT dans votre where.
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
L'IN est très problématique lorsque date
pourrait potentiellement être NULL
donc si vous ne voulez pas utiliser un JOIN
Dans ce cas, je suggérerais EXISTS
. Comme suit :
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
1 votes
Essayez de mettre une virgule avant la deuxième
with
déclaration toute autre après. Je ne suis pas sûr pour postgres mais c'est la syntaxe normale avec Oracle et sql server.2 votes
J'ai essayé d'utiliser une virgule, puis un point-virgule, mais il y avait toujours des erreurs de syntaxe :
ERROR: syntax error at or near "WITH"
pour la virgule etERROR: syntax error at or near ";"
pour le point-virgule.