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
RECURSIVE
est spécifié, il permet unSELECT
sous-requête pour se référencer par son nom.
Bold emphase mienne. Et encore plus perspicace :
Un autre effet de
RECURSIVE
est-ceWITH
les 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
,WITH
les requêtes ne peuvent référencer que le frèreWITH
les requêtes qui sont plus tôt dans leWITH
liste.
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
).