Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

sql gruppieren nach versus eindeutig

GROUP BY ordnet Zeilengruppen einer Zeile zu, pro eindeutigem Wert in spezifisch Spalten, die nicht unbedingt in der Auswahlliste stehen müssen.

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

Diese Abfrage ist legales SQL (Korrektur: nur in MySQL; tatsächlich ist es kein Standard-SQL und wird von anderen Marken nicht unterstützt). MySQL akzeptiert es und vertraut darauf, dass Sie wissen, was Sie tun, indem Sie b auswählen , c , und d eindeutig, da es sich um funktionale Abhängigkeiten von a handelt .

Microsoft SQL Server und andere Marken lassen diese Abfrage jedoch nicht zu, da sie die funktionalen Abhängigkeiten nicht einfach ermitteln können. Bearbeiten: Stattdessen erfordert Standard-SQL, dass Sie die Einzelwertregel befolgen , d.h. jede Spalte in der Auswahlliste muss entweder im GROUP BY benannt werden -Klausel oder ein Argument für eine Set-Funktion sein.

Während DISTINCT betrachtet immer alle Spalten in der Auswahlliste und nur diese Spalten. Es ist ein verbreiteter Irrglaube, dass DISTINCT erlaubt Ihnen, die Spalten anzugeben:

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

Trotz der Klammern, die DISTINCT ergeben wie Funktionsaufruf aussehen, ist es nicht. Es handelt sich um eine Abfrageoption, und ein eindeutiger Wert in einem der drei Felder der Auswahlliste führt zu einer eindeutigen Zeile im Abfrageergebnis. Einer der Ausdrücke in dieser Auswahlliste ist in Klammern eingeschlossen, aber das wirkt sich nicht auf das Ergebnis aus.