Usa la palabra clave WITH
una vez en la cima. Si alguna de sus expresiones de tabla común (CTE) es recursiva (rCTE), debe agregar la palabra clave RECURSIVE
en la parte superior una vez además, aunque no todos los CTE sean recursivos:
WITH RECURSIVE
cte1 AS (...) -- can still be non-recursive
, cte2 AS (SELECT ...
UNION ALL
SELECT ...) -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...
El manual:
Si RECURSIVE
se especifica, permite un SELECT
subconsulta para referenciarse a sí misma por su nombre.
Énfasis en negrita mío. Y, aún más perspicaz:
Otro efecto de RECURSIVE
es que WITH
no es necesario ordenar las consultas :una consulta puede hacer referencia a otra que está más adelante en la lista. (Sin embargo, las referencias circulares o la recursividad mutua no están implementadas). Sin RECURSIVE
, WITH
las consultas solo pueden hacer referencia al hermano WITH
consultas que están antes en WITH
lista.
Énfasis en negrita mío de nuevo. Lo que significa que el orden de WITH
cláusulas es sin sentido cuando el RECURSIVE
se ha utilizado la palabra clave.
Por cierto, desde cte1
y cte2
en el ejemplo no se hace referencia en el exterior SELECT
y son simples SELECT
comandos en sí mismos (sin efectos colaterales), nunca se ejecutan (a menos que se haga referencia en cte3
).