2015-03-25 1 views
0

Je voudrais écrire une déclaration qui ressemble à ceciPuis-je utiliser des alias dans une instruction select?

select 1 as one, 2 as two , one + two as three 

Cependant SQL Server ne peut pas fonctionner ce one + two est.

je peux re-écrire sous cette forme

SELECT x.one 
     ,x.two 
     ,x.one + x.two AS three 
FROM (
    SELECT 1 AS one 
      ,2 AS two 
    ) x 

Ce qui me donne la sortie, je pense. C'est juste un peu brouillon (et plus encore dans un exemple non-artificiel) Je ne suis pas sûr de ce que ce genre de chose fait aux internes de SQL Server et quelles implications il y a à la vitesse d'exécution.

Y a-t-il une meilleure façon de procéder?

+2

Votre approche à l'aide d'un sous-requête est correcte. – gvee

+1

La raison pour laquelle vous n'êtes pas autorisé à faire référence à d'autres colonnes créées par la clause select est que le langage SQL a été spécifié afin que toutes les colonnes soient calculées "comme si" elles sont toutes calculées en parallèle. –

Répondre

4

Vous ne pouvez pas faire référence à un alias dans la même SELECT, vous devez définir dans une sous-requête (comme vous l'avez fait) ou dans un Common-table-expression(CTE):

WITH CTE AS 
(
    SELECT 1 as one, 2 as two 
) 
SELECT one, two, one + two AS three FROM CTE 

Ou avec cette syntaxe:

WITH CTE(one, two) AS 
(
    SELECT 1, 2 
) 
SELECT one, two, one + two as three from CTE 

la même règle s'applique à la WHERE: Reference alias (calculated in SELECT) in WHERE clause

Mais normalement, il ne fait pas mal si vous utilisez la même expression mult iple time, l'optimiseur de serveur sql l'évaluera une seule fois. Ainsi, vous pouvez faire:

SELECT 1 as one, 2 as two , 1 + 2 as three 
+0

Merci. Le problème avec la duplication de la logique est que si quelqu'un le change à un endroit, il doit se souvenir de le faire dans la seconde. L'une ou l'autre approche est-elle bénéfique? le CTE a l'air plus clair à mes yeux. – Loofer

+0

@Loofer: oui, c'est un bon argument contre la répétition. Un autre est que c'est souvent plus complexe. Si vous le regardez plus tard, vous devez d'abord savoir si les deux sont vraiment les mêmes. Je préfère aussi le CTE. –

+0

Également vous avez enlevé mon édition pour expliquer ce qu'est un CTE ... (expression de table commune) était-ce délibéré? Je n'ai pas compris l'acronyme avant de regarder le lien que vous avez posté, mais y a-t-il une raison pour laquelle vous avez inversé ce changement? – Loofer

1

Vous pouvez nommer vos valeurs très simple comme ceci:

SELECT 
    one, two, one + two as three 
FROM (values(1,2)) x(one,two) 
+0

Ne fonctionne pas dans mon SQL Server 2005, je suppose qu'il est plus récent que cela. –

+0

@TimSchmelter fonctionne à partir de SQL Server 2008 –

+0

Merci, et voici le lien: https://msdn.microsoft.com/fr-fr/library/dd776382.aspx –