sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo usar varias declaraciones CON en una consulta de PostgreSQL?

Según los otros comentarios, la segunda Expresión de tabla común [CTE] está precedida por una coma, no por una declaración CON, 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, más tarde normalmente 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 finaliza las 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 en realidad nunca hace referencia a un valor/columna de table_2. Prefiero INNER JOIN sobre IN o Exists así que 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 EXISTE, sería mejor que IN, pero para usar IN necesita una instrucción SELECT real en su ubicación.

SELECT * 
FROM
     table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);

IN es muy problemático cuando date potencialmente podría ser NULL así que si no quieres usar un JOIN entonces sugeriría EXISTS . COMO sigue:

SELECT * 
FROM
     table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);