Utilisez le mot clé WITH une fois au sommet. Si l'une de vos expressions de table communes (CTE) est récursive (rCTE), vous devez ajouter le mot-clé RECURSIVE en haut une fois aussi, même si tous les CTE ne sont pas récursifs :
WITH RECURSIVE
cte1 AS (...) -- can still be non-recursive
, cte2 AS (SELECT ...
UNION ALL
SELECT ...) -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...
Le manuel :
Si
RECURSIVEest spécifié, il permet unSELECTsous-requête pour se référencer par son nom.
Bold emphase mienne. Et encore plus perspicace :
Un autre effet de
RECURSIVEest-ceWITHles requêtes n'ont pas besoin d'être ordonnées :une requête peut en référencer une autre qui se trouve plus loin dans la liste. (Cependant, les références circulaires ou la récursivité mutuelle ne sont pas implémentées.) SansRECURSIVE,WITHles requêtes ne peuvent référencer que le frèreWITHles requêtes qui sont plus tôt dans leWITHliste.
J'insiste à nouveau sur moi. Ce qui signifie que l'ordre de WITH les clauses sont insignifiantes quand le RECURSIVE mot clé a été utilisé.
BTW, depuis cte1 et cte2 dans l'exemple ne sont pas référencés dans le SELECT externe et sont simples SELECT commandes elles-mêmes (pas d'effets collatéraux), elles ne sont jamais exécutées (sauf si référencées dans cte3 ).