Comme indiqué dans Utilisation des expressions de table communes sur MSDN, vous pouvez définir un CTE comme:
WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
et l'utiliser comme:
SELECT <column_list> FROM expression_name;
Disons que j'ai suivi 2 CTE
with cte1 as(
select name from Table1
)
with cte2(name) as(
select name from Table1
)
Une requête génère les mêmes résultats pour les deux CTE car la requête interne est identique. La seule différence entre ces deux est que cte2 a un nom de colonne ( (name)
) défini dans sa déclaration.
Lorsque j'exécute les deux CTE, je ne vois aucune différence dans le plan d'exécution.
Je suis juste curieux de savoir:
- Quelle différence cela fait-il si je ne spécifie aucun nom de colonne dans la définition CTE?
- Pourquoi devrais-je / ne dois-je pas spécifier de noms de colonnes lors de la création de CTE?
- Cela affecte-t-il le plan d'exécution des requêtes par hasard? (Pour autant que je l'ai vu, cela ne fait aucune différence.)
Pour l'anecdote, je préfère nommer les colonnes à l'intérieur du CTE au lieu de l'intérieur de la clause
WITH CTE (xxx) AS
1 , car vous ne mapperez jamais par inadvertance les noms par rapport au contenu des colonnes.Prenons par exemple l'exemple suivant:
Qu'est-ce que cela affiche? Il affiche le contenu de la
y
colonne sous l'en-têtex
et le contenu de lax
colonne sous l'en-têtey
.Avec cette réalisation, je ne spécifie jamais les noms de colonne dans la
(xxx) AS
clause, au lieu de cela je le fais comme ceci:Cela supprime tout doute sur les définitions de colonne.
Sur une note latérale totalement indépendante; spécifiez toujours le nom du schéma lors du référencement des noms d'objet et terminez vos instructions par un point-virgule .
la source
En fin de compte, chaque colonne a besoin d'un nom valide et vous pouvez l'attribuer de deux manières:
Liste des colonnes
Utilisation de noms de colonnes ou d'alias originaux
Lorsque vous effectuez à la fois un alias et une liste de colonnes
Liste des colonnes et alias
Ceci est similaire à la définition d'une vue ou d'une table dérivée, où vous pouvez également spécifier une liste de noms de colonnes.
liste des colonnes : lorsque vous avez beaucoup de calculs complexes, il est plus facile de repérer le nom, car ils ne sont pas dispersés dans le code source. Et c'est plus facile si vous avez un cte récursif et vous pouvez assigner deux noms différents pour la même colonne dans # 3.
nom / alias d'origine : vous devez uniquement attribuer un alias si vous effectuez un calcul ou si vous souhaitez / devez renommer une colonne
la source
SomeAlias = SomeFunction(SomeColumn)
, avec une seule définition de colonne par ligne. Cela permet une simple analyse dans la partie gauche de la liste des colonnes pour localiser celle que vous recherchez.CREATE VIEW SomeView (ColA, ColB, …) AS …
. Maintenant que vous en avez parlé, je pense à des scénarios commeCREATE VIEW MyView (G) AS WITH cte (C) AS (SELECT A AS B FROM MyTable) SELECT E AS F FROM (SELECT C AS D FROM cte) AS s (E);
- quelle joie de déboguer ce serait!