Warum muss ich explizit alle Spalten in einer SQL „GROUP BY“ Klausel angeben - warum nicht „GROUP BY *“?

StackOverflow https://stackoverflow.com/questions/2777235

Frage

Das hat mich immer gestört - warum die GROUP BY-Klausel in einer SQL-Anweisung erforderlich, dass ich alle Nicht-Aggregat-Spalten enthalten? Diese Spalten sollten standardmäßig enthalten sein - eine Art „GROUP BY *“ - da kann ich nicht einmal die Abfrage ausführen, wenn sie alle enthalten sind. Jede Spalte muss entweder ein Aggregat sein, oder in der „GROUP BY“ angegeben werden, aber es scheint, als ob etwas nicht aggregiert werden automatisch gruppiert.

Es ist ein Teil des ANSI-SQL-Standard Vielleicht, aber auch so, ich verstehe nicht, warum. Kann mir jemand helfen, die Notwendigkeit dieser Konvention verstehen?

War es hilfreich?

Lösung

Es ist schwer, genau zu wissen, was die Designer der SQL-Sprache gedacht haben, als sie den Standard schrieb, aber hier ist meine Meinung .

SQL, als allgemeine Regel, müssen Sie ausdrücklich Ihre Erwartungen und Ihre Absicht äußern. Die Sprache versucht nicht zu „erraten, was Sie gemeint“ , und automatisch in die Lücken zu füllen. Das ist eine gute Sache, .

Wenn Sie eine Abfrage die wichtigste Überlegung schreiben ist, dass es korrekte Ergebnisse liefert . Wenn Sie einen Fehler gemacht hat, ist es wahrscheinlich besser, dass die SQL-Parser informieren Sie, eher als eine Vermutung über Ihre Absicht und Ergebnisse zu machen, die möglicherweise nicht korrekt sind. Die deklarative Natur von SQL (wo Sie sagen, was Sie anstatt die Schritte abgerufen werden soll, wie es abzurufen) macht es schon leicht unbeabsichtigt Fehler machen. Die Einführung fuzziniess in die Sprache Syntax würde das nicht besser machen .

In der Tat kann jeder Fall denke ich an, wo die Sprache ermöglicht Verknüpfungen hat Probleme verursacht. Nehmen wir zum Beispiel, natürlich schließt sich - wo Sie die Namen der Spalten auslassen können Sie anschließen möchten, und lassen Sie die Datenbank sie auf Spaltennamen basiert abzuleiten. Sobald die Spaltennamen ändern (wie sie es tun über natürlich Zeit) - die Semantik von vorhandenen Abfragen ändert sich mit ihnen . Das ist schlecht ... sehr schlecht -. Sie wirklich nicht wollen, dass diese Art von Magie geschieht hinter den Kulissen in Ihrem Datenbank-Code

Eine Folge dieser Designwahl ist jedoch, dass SQL eine ausführliche Sprache ist, in dem Sie ausdrücklich Ihre Absicht ausdrücken muss. Dies hat zur Folge haben kann mehr Code zu schreiben, als Sie mögen können, und meckern darüber, warum bestimmte Konstrukte sind so ausführliche ... aber am Ende des Tages -. es ist, was es ist

Andere Tipps

Es ist einfach nur so: Sie SQL-Gruppe, die durch jede einzelne Spalte in der FROM-Klausel die Ergebnisse gebeten, für jede Spalte in dem FROM-Klausel SQL bedeuten, die SQL-Engine wird intern Gruppe der Ergebnismengen, bevor es zu präsentieren . alle Spalten in der schweigen von auch, weil es nicht möglich Gruppe es teilweise so, dass erklärt, warum es Sie fragt. Wenn Sie erwähnen durch Klausel der Gruppe, die nur möglich ist, um SQL Ihre Absicht zu erreichen, indem alle die Spalten als auch die Gruppierung. Es ist eine mathematische Beschränkung.

Der einzige logische Grund, warum ich mich vorstellen kann, die GROUP BY Klausel zu halten, wie es ist, dass Sie Felder umfassen können, die in Ihrer Gruppierung in Ihrer Auswahl Spalte enthalten ist.

Zum Beispiel.

Select column1, SUM(column2) AS sum
 FROM table1
 GROUP BY column1, column3

Auch wenn column3 nicht an anderer Stelle in der Abfrage dargestellt, können Sie immer noch Gruppe der Ergebnisse durch seinen Wert. (Natürlich, wenn Sie das getan haben, können Sie nicht aus dem Ergebnis sagen können, warum die Datensätze gruppiert waren, wie sie waren.)

Es scheint wie eine einfache Abkürzung für das überwiegend häufigste Szenario (von jedem der nicht-aggregierten Spalten Gruppierung) würde Codierung für die Beschleunigung ein einfaches, aber effektives Werkzeug sein.

Vielleicht "GROUP BY *"

Da es schon ziemlich häufig in SQL-Tool ist Verweis auf die Spalten von Ergebnisspaltennummer zu ermöglichen (dh. GROUP BY 1,2,3, etc.) Es wäre einfacher scheint noch in der Lage zu sein, dem Benutzer zu ermöglichen, automatisch schließen alle die Nicht-Aggregatfelder in einem Tastendruck.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top