sql - que - CTE mĂșltiple en una sola consulta
with as() sql (2)
Sí.
No repites el
WITH
.
Solo usa una coma:
WITH cte1 AS (
...
),
cte2 AS (
...
),
cte3 AS (
...
)
SELECT ... FROM ''cte3'' WHERE ...
Y: utilice solo comillas simples para las constantes de cadena y fecha. No los use para alias de columna. No están permitidos para nombres CTE de todos modos.
¿Es posible combinar múltiples CTE en una sola consulta con
arel
?
Estoy buscando una forma de obtener resultados como este:
WITH ''cte1'' AS (
...
),
WITH RECURSIVE ''cte2'' AS (
...
),
WITH ''cte3'' AS (
...
)
SELECT ... FROM ''cte3'' WHERE ...
Como puede ver, tengo un CTE recursivo y dos no recursivos.
Use la palabra clave
WITH
una vez
en la parte superior.
Si alguna de sus expresiones de tabla comunes (CTE) es recursiva (rCTE), debe agregar la palabra clave
RECURSIVE
en la parte superior también
una vez
, incluso si no todos los CTE son recursivos:
WITH RECURSIVE
cte1 AS (...) -- can still be non-recursive
, cte2 AS (SELECT ...
UNION ALL
SELECT ...) -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...
Si se especifica
RECURSIVE
, permite que una subconsultaSELECT
haga referencia a sí misma por su nombre.
El énfasis audaz es mío. Y, aún más perspicaz:
Otro efecto de
RECURSIVE
es que las consultasWITH
no necesitan ordenarse : una consulta puede hacer referencia a otra que se encuentra más adelante en la lista. (Sin embargo, las referencias circulares, o recursión mutua, no se implementan). SinRECURSIVE
, las consultasWITH
solo pueden hacer referencia a consultas de hermanosWITH
que se encuentran anteriormente en la listaWITH
.
El énfasis audaz es mío nuevamente.
Esto significa que el orden de las cláusulas
WITH
tiene
sentido
cuando se ha utilizado la palabra clave
RECURSIVE
.
Por cierto, dado que
cte1
y
cte2
en el ejemplo no están referenciados en el
SELECT
externo y son comandos
SELECT
simples (sin efectos colaterales), nunca se ejecutan (a menos que se haga referencia en
cte3
).