2010-10-11 4 views
2

J'ai récemment découvert les expressions de tables communes récurrentes (CTE) en cherchant un moyen de construire une certaine vue de certaines données. Après avoir pris un moment 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". Je suis à nouveau surpris que « TOP » n'a pas été autorisé, et est venu à constater que toutes ces clauses ne sont pas autorisés dans la partie récursive d'un CTE:Pourquoi les CTE récursifs ne peuvent-ils pas utiliser les clauses de regroupement et autres?

  • DISTINCT
  • GROUP BY
  • PRESENTANT
  • TOP
  • GAUCHE
  • DROIT
  • OUTER JOIN

Je suppose que j'ai 2 questions:

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

Merci.

Répondre

2

Se référant à: -

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

Sur la base de ma compréhension du CTE, l'idée derrière la création d'un CTE est que vous pouvez créer un jeu de résultats temporaires et de l'utiliser d'une manière nommé comme une table régulière SELECT, INSERT , UPDATE, ou DELETE instructions. Comme un CTE ressemble logiquement à une vue, l'instruction SELECT de votre requête CTE doit suivre les mêmes exigences que celles utilisées pour créer une vue. Référer ** définitions de la requête CTE * section lien suivant sur MSDN

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

Avec au sujet de

2.Dans je dois faire une sorte de récursion en utilisant certaines de ces clauses, est ma seule alternative à écrire une procédure stockée récursive?

De plus, je suis sûr que vous pouvez utiliser au moins quelques-uns des mots-clés que vous avez mentionnés ci-dessus dans une vue /CTE instruction select. Par exemple: Reportez-vous à l'utilisation de GROUP BY dans un ECU here in the Creating a simple common table expression example

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.

+0

Les deux liens se réfèrent à la même page Web et je ne le recommanderais pas car il contient beaucoup d'incohérences et de bugs. Avez-vous vraiment exécuté des scripts? et le lire? Utilisez http://msdn.microsoft.com/en-us/library/ms175972(v=SQL.100).aspx à la place –

+0

@ vgv8 - Oui, les deux liens sont à la même page Web - je faisais référence à la même page juste différente sections dans ma réponse. En outre, je demandais simplement à l'OP de voir l'exemple indiqué ici pour référence sur la façon d'utiliser le Group By. Je ne suis au courant d'aucune incohérence là pour les parties auxquelles je suis référencé mais si vous pouvez les mettre en évidence, cela vous aidera !! – InSane

+0

En liant le script dans la section "C. Référencer une expression de table commune plus d'une fois" ne référence plus d'une fois le CTE. Les scripts suivants ne fonctionnent pas du tout puisqu'ils sont inexistants dbo.MyEmployees –