Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

groupe sql par versus distinct

GROUP BY mappe des groupes de lignes sur une ligne, par valeur distincte dans spécifique colonnes, qui ne doivent même pas nécessairement être dans la liste de sélection.

SELECT b, c, d FROM table1 GROUP BY a;

Cette requête est en SQL légal (correction : uniquement dans MySQL ; en fait, ce n'est pas du SQL standard et il n'est pas pris en charge par d'autres marques). MySQL l'accepte et espère que vous savez ce que vous faites, en sélectionnant b , c , et d de manière non ambiguë car ce sont des dépendances fonctionnelles de a .

Cependant, Microsoft SQL Server et d'autres marques n'autorisent pas cette requête, car il ne peut pas déterminer facilement les dépendances fonctionnelles. modifier : Au lieu de cela, le SQL standard vous oblige à suivre la règle de la valeur unique , c'est-à-dire que chaque colonne de la liste de sélection doit soit être nommée dans le GROUP BY clause ou être un argument d'une fonction d'ensemble.

Alors que DISTINCT regarde toujours toutes les colonnes de la liste de sélection, et uniquement ces colonnes. C'est une idée fausse commune que DISTINCT permet de spécifier les colonnes :

SELECT DISTINCT(a), b, c FROM table1;

Malgré les parenthèses faisant DISTINCT ressemble à un appel de fonction, ce n'est pas le cas. C'est une option de requête et une valeur distincte dans l'un des trois champs de la liste de sélection conduira à une ligne distincte dans le résultat de la requête. L'une des expressions de cette liste de sélection est entourée de parenthèses, mais cela n'affectera pas le résultat.