Es gibt einen weiteren Grund für Warum muss ich in SQL angeben, nach welchen Attributen gruppiert werden soll?
Lets sat haben wir zwei einfache Tabellen: friend
y car
, wo wir Informationen über unsere Freunde und ihre Autos speichern.
Und nehmen wir an, wir wollen die Daten aller unserer Freunde (aus der Tabelle friend
) und für jeden unserer Freunde, wie viele Autos sie jetzt besitzen, verkauft haben, verunfallt sind und die Gesamtzahl. Oh, und wir wollen die Älteren zuerst, die Jüngeren zuletzt.
Wir würden so etwas tun wie:
SELECT f.id
, f.firstname
, f.lastname
, f.birthdate
, COUNT(NOT c.sold AND NOT c.crashed) AS owned
, COUNT(c.sold) AS sold
, COUNT(c.crashed) AS crashed
, COUNT(c.friendid) AS totalcars
FROM friend f
LEFT JOIN car c <--to catch (shame!) those friends who have never had a car
ON f.id = c.friendid
GROUP BY f.id
, f.firstname
, f.lastname
, f.birthdate
ORDER BY f.birthdate DESC
Aber brauchen wir wirklich all diese Felder in der GROUP BY
? Ist nicht jeder Freund auf einzigartige Weise durch seine id
? Mit anderen Worten, sind nicht die firstname, lastname and birthdate
funktionell abhängig von der f.id
? Warum nicht einfach tun (wie wir in MySQL können):
SELECT f.id
, f.firstname
, f.lastname
, f.birthdate
, COUNT(NOT c.sold AND NOT c.crashed) AS owned
, COUNT(c.sold) AS sold
, COUNT(c.crashed) AS crashed
, COUNT(c.friendid) AS totalcars
FROM friend f
LEFT JOIN car c <--to catch (shame!) those friends who have never had a car
ON f.id = c.friendid
GROUP BY f.id
ORDER BY f.birthdate
Und was wäre, wenn wir 20 Felder in der SELECT
(plus ORDER BY
) Teile? Ist die zweite Abfrage nicht kürzer, klarer und wahrscheinlich schneller (in den RDBMS, die sie akzeptieren)?
Ich sage ja. Sagen also die SQL 1999 und 2003 Spezifikationen, wenn dieser Artikel korrekt ist: Entlarvung von Mythen über Gruppen
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.
3 Stimmen
Wie es scheint, haben bereits mehrere Tausend Menschen solche Bedenken an das ANSI-Komitee herangetragen, so dass sie die Definition von "group by" in ANSI 1999 SQL geändert haben. Dies ist in der Antwort von ypercube beschrieben. Viele Dinge, die von "wirklich klugen Leuten" und vor allem von Ausschüssen derselben entwickelt wurden, sind hoffnungslos fehlerhaft^W^W und weit vom Ideal entfernt.