33 Stimmen

Ist SQL GROUP BY ein Konstruktionsfehler?

Warum muss ich in SQL angeben, nach welchen Attributen gruppiert werden soll? Warum kann es nicht einfach alle Nicht-Aggregate verwenden?

Wenn ein Attribut nicht aggregiert ist und nicht in der GROUP BY Klausel dann nicht-deterministische Wahl wäre die einzige Option unter der Annahme, dass Tupel ungeordnet sind (mysql Art tut dies) und das ist eine riesige gotcha. Soweit ich weiß, erfordert Postgresql, dass alle Attribute, die nicht in der GROUP BY aggregiert werden, was sie als überflüssig erscheinen lässt.

  • Übersehe ich etwas oder ist dies ein Fehler im Sprachdesign, der lockere Implementierungen fördert und Abfragen schwieriger zu schreiben macht?
  • Wenn ich etwas übersehe, was ist eine Beispielabfrage, wo Gruppenattribute nicht abgeleitet werden können?

17 Stimmen

Wir werden Ihre Bedenken an das ANSI SQL Committee weiterleiten.

5 Stimmen

Hehe. Das ist die Sache. Es wurde von einigen sehr klugen Leuten entworfen, also muss es etwas geben, das ich nicht sehe.

0 Stimmen

Das sage ich schon seit langem.

2voto

AJ. Punkte 12931

Ich stimme zu

Ich bin mit der Frage durchaus einverstanden. Ich habe die gleiche Frage gestellt aquí .

Ich glaube ehrlich gesagt, dass es sich um einen sprachlichen Fehler handelt.

Ich weiß, dass es Argumente dagegen gibt, aber ich habe noch nie eine GROUP BY-Klausel verwendet, die etwas anderes als alle nicht aggregierten Felder aus der SELECT-Klausel in der realen Welt enthält.

1voto

James Wiseman Punkte 29172

1voto

Chris Latta Punkte 19734

Ich würde sagen, es ist eher eine Entscheidung des Sprachdesigns, dass Entscheidungen explizit und nicht implizit getroffen werden. Was ist zum Beispiel, wenn ich die Daten in einer anderen Reihenfolge gruppieren möchte als der, in der ich die Spalten ausgebe? Oder wenn ich nach Spalten gruppieren möchte, die nicht in den ausgewählten Spalten enthalten sind? Oder wenn ich nur gruppierte Spalten ausgeben und keine Aggregatfunktionen verwenden möchte? Nur wenn ich meine Präferenzen in der Group-by-Klausel explizit angebe, sind meine Absichten klar.

Sie müssen auch bedenken, dass SQL eine sehr alte Sprache ist (1970). Schauen Sie sich an, wie Linq alles umgedreht hat, damit Intellisense funktioniert - für uns ist das heute offensichtlich, aber SQL ist älter als IDEs und konnte daher solche Probleme nicht berücksichtigen.

0 Stimmen

+1 für den Hinweis auf die Bedeutung der Reihenfolge der Felder in einer ORDER BY . A ... GROUP BY a, b kann zu anderen Ergebnissen führen, als wenn ... GROUP BY b, a

0voto

René Nyffenegger Punkte 37584

Die "superflous"-Attribute beeinflussen die Reihenfolge des Ergebnisses.

Bedenken Sie:

create table gb (
  a number,
  b varchar(3),
  c varchar(3)
);

insert into gb values (   3, 'foo', 'foo');
insert into gb values (   1, 'foo', 'foo');
insert into gb values (   0, 'foo', 'foo');

insert into gb values (  20, 'foo', 'bar');
insert into gb values (  11, 'foo', 'bar');
insert into gb values (  13, 'foo', 'bar');

insert into gb values ( 170, 'bar', 'foo');
insert into gb values ( 144, 'bar', 'foo');
insert into gb values ( 130, 'bar', 'foo');

insert into gb values (2002, 'bar', 'bar');
insert into gb values (1111, 'bar', 'bar');
insert into gb values (1331, 'bar', 'bar');

Diese Aussage

select sum(a), b, c
  from gb
group by b, c;

führt zu

    44 foo bar
   444 bar foo
     4 foo foo
  4444 bar bar

während dieser

select sum(a), b, c
  from gb
group by c, b;

führt zu

   444 bar foo
    44 foo bar
     4 foo foo
  4444 bar bar

5 Stimmen

Das einzige, was die Reihenfolge bestimmt, ist eine ORDER BY-Klausel. Wenn Sie nicht ausdrücklich angeben, in welcher Reihenfolge die Daten zurückgegeben werden sollen, kann die Datenbank sie so anordnen, wie es für sie am günstigsten ist. Dies ist von Datenbank zu Datenbank unterschiedlich. Ohne eine ORDER BY-Klausel ist jeder Anschein von Ordnung rein zufällig.

0 Stimmen

-1 GROUP BY impliziert nicht SORT . Sowohl Parallelität als auch Hash-Aggregate können dazu führen, dass die Ergebnisse nicht so sortiert werden, wie es den Anschein hat. Außerdem können Sie in SQL Server (und möglicherweise auch in anderen RDBMS), wenn Sie GROUP BY PK, Other Functionally Dependant Cols ignoriert es diese anderen Spalten in der GROUP BY Betrieb sind sie nur in der GROUP BY um syntaktisch gültig zu sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X