PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Plusieurs CTE en une seule requête

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 un SELECT sous-requête pour se référencer par son nom.

Bold emphase mienne. Et encore plus perspicace :

Un autre effet de RECURSIVE est-ce WITH 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.) Sans RECURSIVE , WITH les requêtes ne peuvent référencer que le frère WITH les requêtes qui sont plus tôt dans le WITH 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 ).