Je Tableau A avec des colonnes X, Y, Z.
X est un FK, Y est une description. Chaque X a exactement un correspondant Y. Donc, si X reste le même sur plusieurs enregistrements, Y reste le même aussi. Donc, il peut y avoir un certain nombre de dossiers où X et Y sont les mêmes.
Maintenant, je suis en cours d'exécution de la requête suivante:
SELECT X, Y
FROM A
GROUP BY X;
Est-ce que ce travail de recherche? Y est censé être regroupés aux côtés de X, mais je na pas préciser dans explicitement la requête. Est-ce que MySQL agit toujours de cette façon si implicitement? Et est ce comportement / fiable standardisé? En outre, les résultats seront varient en fonction du type de données de Y. Par exemple, est-il une différence si Y est VARCHAR, CHAR ou INT? Dans le cas d'un int, sera le résultat d'une SOMME () des dossiers regroupés?
Le MySQL comportement va exposer dans un tel cas normés / normalisé et où puis-je regarder vers le haut?
Chacun
X
a exactement un correspondantY
SELECT X, Y FROM A GROUP BY X;
Est-ce que ce travail de recherche?
Techniquement, ce qui se passe lorsque vous exécutez cette requête sous MySQL dépend wether SQL mode ONLY_FULL_GROUP_BY
est activé ou non:
elle est activée, les erreurs de requête: toutes les colonnes non agrégées doivent apparaître dans la
GROUP BY
clause (vous devez ajouterY
à laGROUP BY
clause)Sinon, les exécute la requête, et vous donne une quelconque valeur
Y
pour chaqueX
; mais depuisY
est dépendante functionnaly surX
, la valeur est en réalité prévisible, donc c'est OK.
En général, bien que la norme SQL ne reconnaît la notion de colonne dépendante functionnaly, il est une bonne pratique toujours inclure tous les colums non agrégées dans la GROUP BY
clause. Il est également une exigence dans la plupart des bases de données autres que MySQL (et, à partir de MySQL 5.7, ONLY_FULL_GROUP_BY
est activé par défaut). Cela vous empêche également de divers pièges et comportements imprévisibles.
L' utilisation ANY_VALUE()
rend la requête valide et explicite sur son objectif:
SELECT X, ANY_VALUE(Y) FROM A GROUP BY X;
Notez que si vous souhaitez que les combinaisons distinctes X, Y
, il est plus simple à utiliser SELECT DISTINCT
:
SELECT DISTINCT X, Y FROM A;