Me gustaría "declarar" cuáles son efectivamente múltiples tablas TEMP usando la instrucción WITH. La consulta que estoy tratando de ejecutar está en las líneas de:
WITH table_1 AS (
SELECT GENERATE_SERIES('2012-06-29', '2012-07-03', '1 day'::INTERVAL) AS date
)
WITH table_2 AS (
SELECT GENERATE_SERIES('2012-06-30', '2012-07-13', '1 day'::INTERVAL) AS date
)
SELECT * FROM table_1
WHERE date IN table_2
Leí la documentación de PostgreSQL e investigué sobre el uso de varias WITH
declaraciones y no pude encontrar una respuesta.
with
declaración y cualquier otra después. No estoy seguro acerca de Postgres, pero esa es la sintaxis normal con Oracle y SQL ServerERROR: syntax error at or near "WITH"
para la coma yERROR: syntax error at or near ";"
para el punto y coma.Respuestas:
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. PrefieroINNER JOIN
másIN
oExists
menos aquí hay una sintaxis que debería funcionar conJOIN
: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 unJOIN
, te sugieroEXISTS
. Como sigue:SELECT * FROM table_1 t1 WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
fuente
También puede encadenar sus resultados utilizando la declaración WITH. P.ej:
WITH tab1 as (Your SQL statement), tab2 as ( SELECT ... FROM tab1 WHERE your filter), tab3 as ( SELECT ... FROM tab2 WHERE your filter) SELECT * FROM tab3;
fuente