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 ).