Was bedeutet die SQL-Klausel „GROUP BY 1“?

200

Jemand hat mir eine SQL-Abfrage gesendet, in der die GROUP BYKlausel aus der folgenden Anweisung bestand : GROUP BY 1.

Das muss ein Tippfehler sein, oder? Keine Spalte erhält den Alias ​​1. Was könnte das bedeuten? Bin ich zu Recht davon ausgegangen, dass dies ein Tippfehler sein muss?

Spencer
quelle
6
Es ist kein Tippfehler, es ist die erste Spalte Ihrer Ergebnismenge
Lamak
9
Beachten Sie, dass diese Syntax nicht portierbar ist. In anderen Datenbanken als MySQL verhält es sich anders. In Oracle wird es beispielsweise als Konstante behandelt.
Russell Reed
2
@RussellReed Ja. Leider (da die Verwendung eines Alias ​​manchmal sehr hilfreich ist) erlaubt ansi sql keine Gruppierung nach Spaltenordnungszahl. Der Grund ist, dass die Gruppe vor der Projektion stattfindet. Aber dann ... was ist, wenn wir Gruppierungsausdrücke mit Dutzenden von Zeilen haben ... enden wir mit ... Vielfachen von Dutzenden von Zeilen in der endgültigen SQL-Anweisung.
Javadba

Antworten:

229

Es bedeutet, nach der ersten Spalte zu gruppieren, unabhängig davon, wie sie heißt. Sie können das gleiche mit tun ORDER BY.

Yuck
quelle
74
SELECT account_id, open_emp_id
         ^^^^        ^^^^
          1           2

FROM account
GROUP BY 1;

In der obigen Abfrage GROUP BY 1bezieht sich auf das, first column in select statementwas ist account_id.

Sie können auch in angeben ORDER BY.

Hinweis: Die Zahl in ORDER BY und GROUP BY beginnt immer mit 1 und nicht mit 0.

Vishwanath Dalvi
quelle
25

Zusätzlich zur Gruppierung nach dem Feldnamen können Sie auch nach Ordnungszahl oder Position des Felds in der Tabelle gruppieren. 1 entspricht dem ersten Feld (unabhängig vom Namen), 2 ist das zweite und so weiter.

Dies ist im Allgemeinen nicht ratsam, wenn Sie sich zu einer bestimmten Gruppe zusammenschließen, da sich die Tabellen- / Ansichtsstruktur ändern kann. Darüber hinaus kann es schwierig sein, schnell zu verstehen, was Ihre SQL-Abfrage tut, wenn Sie die Tabellenfelder nicht gespeichert haben.

Wenn Sie einen eindeutigen Satz zurückgeben oder schnell eine temporäre Suche durchführen, ist dies eine nette Kurzsyntax, um die Eingabe zu reduzieren. Wenn Sie die Abfrage irgendwann erneut ausführen möchten, würde ich empfehlen, diese zu ersetzen, um zukünftige Verwirrung und unerwartete Komplikationen (aufgrund von Schemaänderungen) zu vermeiden.

vol7ron
quelle
10
+1 für "Tu das nicht" und ich möchte hinzufügen, dass der beste Grund, dies zu vermeiden, darin besteht, dass es nicht lesbar ist.
Yuck
11

Es wird nach dem ersten Feld in der select-Klausel gruppiert

Daan Geurts
quelle
5

Das bedeutet, SQL-Gruppe nach 1. Spalte in Ihrer Select-Klausel. Wir verwenden dies immer GROUP BY 1zusammen mit ORDER BY 1. Außerdem können Sie dies auch so verwenden. GROUP BY 1,2,3..Natürlich ist es für uns praktisch, aber Sie müssen auf diese Bedingung achten. Das Ergebnis ist möglicherweise nicht das, was Sie sind möchten, wenn jemand Ihre ausgewählten Spalten geändert hat und es nicht visualisiert wird

张艳军
quelle
4

Es wird nach der Spaltenposition gruppiert, die Sie nach der group by-Klausel setzen.

Wenn Sie beispielsweise ' SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1' ausführen , wird es nach gruppiert SALESMAN_NAME.

Ein Risiko dabei ist, wenn Sie ' Select *' ausführen und aus irgendeinem Grund die Tabelle mit Spalten in einer anderen Reihenfolge neu erstellen, erhalten Sie ein anderes Ergebnis als erwartet.

wdoering
quelle