CTE Multiple dans une seule requête

est-il possible de combiner plusieurs CTEs en une seule requête avec arel ? Je cherche le moyen d'obtenir le résultat comme ceci:

WITH 'cte1' AS (
...
),
WITH RECURSIVE 'cte2' AS (
...
),
WITH 'cte3' AS (
...
)
SELECT ... FROM 'cte3' WHERE ...

comme vous pouvez le voir, j'ai un CTE récursif et deux non récursifs.

21
demandé sur Erwin Brandstetter 2016-02-07 03:17:37

2 réponses

utilisez le mot clé WITH une fois en haut et si l'une de vos Expressions de la Table commune (CTE) est récursive (rCTE) vous devez ajouter le mot clé RECURSIVE en haut aussi, même si toutes les expressions de la Table commune (CTE) ne sont pas récursives:

WITH RECURSIVE
  cte1 AS (...)  -- can still be non-recursive
, cte2 AS (SELECT ...
           UNION ALL
           SELECT ...)  -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...

citant le manuel:

si RECURSIVE est spécifié, il permet a SELECT sous - référence elle-même par son nom.

le Gras c'est moi qui souligne. Et, encore plus perspicace:

un autre effet de RECURSIVE est que WITH les requêtes ne doivent pas être commandées : une requête peut renvoyer à une autre qui est plus tard dans la liste. (Cependant, les renvois circulaires, ou récursions mutuelles, ne sont pas mis en œuvre.) Sans RECURSIVE , les requêtes WITH ne peuvent faire référence qu'à un frère ou une sœur. WITH les requêtes qui sont plus tôt dans la liste WITH .

c'est encore moi qui souligne. Ce qui signifie que l'ordre des clauses WITH est sans signification lorsque le mot clé RECURSIVE a été utilisé.

BTW, puisque cte1 et cte2 ne sont pas référencés dans l'extérieur SELECT et sont des commandes simples SELECT eux-mêmes (pas d'effets collatéraux), ils ne sont jamais exécutés (sauf indication contraire dans cte3 ).

38
répondu Erwin Brandstetter 2017-12-31 06:42:03

Oui. Vous ne répétez pas le WITH . Vous n'utilisez qu'une virgule:

WITH cte1 AS (
...
),
     cte2 AS (
...
),
     cte3 AS (
...
)
SELECT ... FROM 'cte3' WHERE ...

et: n'utilisez que des guillemets simples pour les constantes de chaîne et de date. Ne les utilisez pas pour les alias de colonne. Ils ne sont pas autorisés pour les noms CTE de toute façon.

13
répondu Gordon Linoff 2016-02-07 00:41:51