Usa la parola chiave WITH
una volta in cima. Se una delle tue Common Table Expressions (CTE) è ricorsiva (rCTE) devi aggiungere la parola chiave RECURSIVE
in alto una volta inoltre, anche se non tutti i CTE sono ricorsivi:
WITH RECURSIVE
cte1 AS (...) -- can still be non-recursive
, cte2 AS (SELECT ...
UNION ALL
SELECT ...) -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...
Il manuale:
Se RECURSIVE
è specificato, consente un SELECT
sottoquery per fare riferimento a se stessa per nome.
Enfasi in grassetto mio. E, ancora più perspicace:
Un altro effetto di RECURSIVE
è quello WITH
le query non devono essere ordinate :una query può fare riferimento a un'altra che è più avanti nell'elenco. (Tuttavia, i riferimenti circolari o la ricorsione reciproca non sono implementati.) Senza RECURSIVE
, WITH
le query possono fare riferimento solo al fratello WITH
query che sono precedenti in WITH
elenco.
Enfasi audace la mia di nuovo. Significa che l'ordine di WITH
clausole è privo di significato quando il RECURSIVE
è stata utilizzata la parola chiave.
A proposito, poiché cte1
e cte2
nell'esempio non sono referenziati nel SELECT
esterno e sono semplici SELECT
comandi stessi (nessun effetto collaterale), non vengono mai eseguiti (a meno che non sia indicato in cte3
).