Según los otros comentarios, la segunda expresión de tabla común [CTE] está precedida por una coma, no una declaración WITH, por lo que
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
En términos de su consulta real, esta sintaxis debería funcionar en PostgreSql, Oracle y sql-server, bueno, lo más tarde, por lo general, procederá WITH
con un punto y coma ( ;WTIH
), pero eso se debe a que, por lo general, la gente del servidor sql (incluido yo mismo) no termina declaraciones anteriores que deben finalizar antes de que se defina un CTE ...
Sin embargo, tenga en cuenta que tuvo un segundo problema de sintaxis con respecto a su WHERE
declaración. WHERE date IN table_2
no es válido porque nunca hace referencia a un valor / columna de table_2. Prefiero INNER JOIN
más IN
o Exists
menos aquí hay una sintaxis que debería funcionar con 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 desea mantener la forma en que lo tenía, que normalmente EXISTS sería mejor que IN, pero para usar IN, necesita una declaración SELECT real en su where.
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
IN es muy problemático cuando date
podría serlo, NULL
así que si no quieres usar un JOIN
, te sugiero EXISTS
. Como sigue:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
with
declaración y cualquier otra después. No estoy seguro acerca de Postgres, pero esa es la sintaxis normal con Oracle y SQL Server