Pourquoi les CTE récursifs ne peuvent-ils pas utiliser les clauses de regroupement et autres?

Récemment, j'ai découvert les expressions de tables communes récurrentes (CTE) en cherchant un moyen de build une certaine vue de certaines données. Après avoir pris un certain time pour écrire comment la première itération de ma requête fonctionnerait, je l'ai transformée en CTE pour regarder le tout se dérouler. J'ai été surpris de voir que le regroupement ne fonctionnait pas, alors je l'ai juste remplacé par un équivalent "Select TOP 1, ORDER BY". J'ai été de nouveau surpris que "TOP" ne soit pas autorisé, et j'ai fini par découvrir que toutes ces clauses ne sont pas autorisées dans la partie récursive d'un CTE:

  • DISTINCT
  • PAR GROUPE
  • AYANT
  • HAUT
  • LA GAUCHE
  • DROITE
  • OUTER JOIN

Donc je suppose que j'ai 2 questions:

  1. Afin de mieux comprendre ma situation et SQL, pourquoi ces clauses ne sont-elles pas autorisées?
  2. Si j'ai besoin de faire une sorte de récursion en utilisant certaines de ces clauses, est ma seule alternative pour écrire une procédure stockée récursive?

Merci.

Se référant à :-

  1. Afin de mieux comprendre ma situation et SQL, pourquoi ces clauses ne sont-elles pas autorisées?

Basé sur ma compréhension des CTE, l'idée derrière la création d'un CTE est que vous pouvez créer un jeu de résultats temporaire et l'utiliser comme une table ordinaire dans les SELECT , INSERT , UPDATE ou DELETE .

Dans la mesure où un CTE ressemble logiquement à une vue, l' SELECT de votre requête CTE doit suivre les mêmes exigences que celles utilisées pour créer une vue. Reportez-vous à ** section Définitions des requêtes CTE * dans le lien suivant sur MSDN

En outre, comme un CTE est essentiellement un resultset nommé et qu'il peut être utilisé comme n'importe quelle table dans les SELECT , INSERT , UPDATE ou DELETE , vous avez toujours la possibilité d'utiliser les différents opérateurs que vous avez mentionnés lorsque vous utilisez le CTE déclarations.

Avec en ce qui concerne

2.Si j'ai besoin de faire une sorte de récursion en utilisant certaines de ces clauses, est ma seule alternative pour écrire une procédure stockée récursive?

Aussi, je suis sûr que vous pouvez utiliser au less quelques-uns des mots-keys que vous avez mentionnés ci-dessus dans une déclaration de sélection / CTE . Par exemple: Reportez-vous à l'utilisation de GROUP BY dans un CTE ici dans l'exemple Création d'une expression simple d'une table commune

Peut-être, si vous pouvez fournir un exemple de scénario de ce que vous essayez d'atteindre, nous pouvons suggérer une solution possible.