CREATE TABLE T1 (a int); CREATE TABLE T2 (a int); SELECT T1.a , T2.a FROM T1 JOIN T2 ON T1.a=T2.a GROUP BY T1.a; I get an error from this code: Msg 8120 Level 16. Column 'T2.a' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. I would have expected this to work because T1.a and T2.a are joined
3 Réponses :
J'aurais attendu que cela fonctionne car T1.A et T2.A sont rejoints P>
Cela a du sens, mais malheureusement: non. SQL Server voit deux colonnes non traitées différentes dans la clause code> (code> code>, et les souhaite dans la clause
code> également: p>
xxx pré> D'autre part, étant donné que vous em> vous joignez à ces colonnes, vous savez également que les deux ont la même valeur, alors pourquoi devriez-vous avoir besoin de produire les deux dans les Resultats? P>
SELECT a FROM T1 JOIN T2 ON USING(a) GROUP BY a
Il suffit d'ajouter la colonne t2.a
dans GROUP BY
:
SELECT T1.a , T2.a FROM T1 JOIN T2 ON T1.a= T2.a GROUP BY T1.a, T2.a;
Il faut ajouter t2.a comme lorsque SQL Server regroupe les mêmes lignes par
t1.a
, il ne sait pas quelle colonne doit être choisie pour t2.a
.
p>
Je m'attendais à ce que cela fonctionne parce que T1.a et T2.a sont joints
Le standard SQL stipule que lorsqu'il y a dépendance entre les colonnes d'une même table , il n'est pas nécessaire d'agréger les dépendants. Par exemple, si vous effectuez une agrégation par clé primaire, vous n'avez pas besoin d'agréger d'autres colonnes du même tableau. Cependant ce n'est pas le cas, puisque le
T2.a
est sur une table différente. Néanmoins, SQL Server n'implémente pas cette partie de la norme de toute façon.Maintenant, avec une modification mineure, cela fonctionne:
SELECT T1.a , T2.a FROM T1 JOIN T2 ON T1.a=T2.a GROUP BY T1.a , T2.a;Voir l'exemple d'exécution à DB Fiddle .
@LudovicAubert. . . Votre attente est fausse. C'est aussi simple que cela. Les colonnes (expressions) non agrégées dans
SELECT
doivent être dansGROUP BY
.