163 votes

SQL - utilisation d'alias dans Group By

Juste curieux de connaître la syntaxe SQL. Donc si j'ai

 SELECT 
 itemName as ItemName,
 substring(itemName, 1,1) as FirstLetter,
 Count(itemName)
FROM table1
GROUP BY itemName, FirstLetter
 

Ce serait incorrect parce que

 GROUP BY itemName, FirstLetter 
 

devrait vraiment être

 GROUP BY itemName, substring(itemName, 1,1)
 

Mais pourquoi ne pouvons-nous pas simplement utiliser l'ancien pour plus de commodité?

336voto

Codo Points 28685

SQL est implémenté comme si une requête était exécutée dans l'ordre suivant:

  1. Clause FROM
  2. Clause WHERE
  3. Clause GROUP BY
  4. Clause HAVING
  5. Clause SELECT
  6. Clause ORDER BY

Cet ordre dans la plupart des systèmes de bases de données relationnelles explique quels noms (colonnes ou alias) sont valides car ils doivent avoir été introduits à une étape précédente. Il y a des exceptions cependant.

29voto

Chris Shaffer Points 18066

Vous pouvez toujours utiliser une sous-requête pour pouvoir utiliser l'alias. Bien sûr, vérifiez les performances (il est possible que le serveur de base de données exécute les deux tâches de la même manière, mais ne bloque jamais pour vérification):

 SELECT ItemName, FirstLetter, COUNT(ItemName)
FROM (
    SELECT ItemName, SUBSTRING(ItemName, 1, 1) AS FirstLetter
    FROM table1
    ) ItemNames
GROUP BY ItemName, FirstLetter
 

21voto

Bill Gribble Points 1068

Au moins dans PostgreSQL, vous pouvez utiliser le numéro de colonne dans le jeu de résultats de votre clause GROUP BY:

 SELECT 
 itemName as ItemName,
 substring(itemName, 1,1) as FirstLetter,
 Count(itemName)
FROM table1
GROUP BY 1, 2
 

Bien sûr, cela commence à être un problème si vous le faites de manière interactive et que vous modifiez la requête pour modifier le nombre ou l'ordre des colonnes dans le résultat. Mais reste.

15voto

bobs Points 12893

SQL Server n'autorise pas de référence de l'alias dans la clause GROUP BY, en raison de la logique de commande de traitement. La clause GROUP BY est traitée avant que la clause SELECT, donc l'alias n'est pas connu au moment de la clause GROUP BY est évaluée. Cela explique aussi pourquoi, vous pouvez utiliser l'alias dans la clause ORDER BY.

Voici une source d'information sur la logique de SQL Server phases de traitement.

4voto

bernie Points 44206

Certains SGBD vous permettent d'utiliser un alias au lieu de devoir répéter toute l'expression.
Teradata en est un exemple.

J'évite la notation de position ordinale recommandée par Bill pour les raisons documentées dans cette question SO .

L’alternative simple et robuste consiste à toujours répéter l’expression dans la clause GROUP BY.
DRY ne s'applique pas à SQL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X