Axel Richter: select max() geht nicht

Beitrag lesen

Hallo,

Man kann nicht einfach grundsätzlich die WHERE-Bedingung als HAVING schreiben. Wie gesagt: Im _Ergebnis_ dieses konkreten Querys ändert das nichts, andernfalls aber schon.

Machen wir es doch ganz deutlich:
Man kann HAVING nur auf die Felder anwenden, die im Query direkt aufgerufen werden, oder auf Ergebnisse von Aggregatfunktionen. Nicht anwenden kann man HAVING auf Felder, die zwar in der Tabelle vorhanden sind aber im konkreten Query nicht vorkommen. HAVING behandelt nunmal die Resultatsdatensatzmenge _nach_ der Gruppierung und der Auswertung der Aggregatfunktionen.

Man muss also WHERE verwenden, wenn man nach Feldern filtern will, die nicht im aktuellen Query vorkommen. Man sollte WHERE (versuchen zu)[1] verwenden, um nach Feldern zu filtern, die nicht per Aggregatfunktion behandelt werden, deshalb also gar nicht erst in die Gruppierung müssen.

[1]ggf. mit DB-Analysetools die Performance vergleichen, um nicht doch in eine Aushebelung eventuell vorhandener Optimizer-Funktionen zu stolpern.

Nicht dass hinterher irgendwer deinen Tipp so interpretiert, dass WHERE und GROUP BY nicht miteinander funktionieren können, oder so.

Hm, das tut es manchmal auch nicht ;-). Genau nämlich dann, wenn man mit WHERE versucht nach dem Ergebnis von Aggregatfunktionen zu filtern, die ja erst nach Gruppierung und Ausführung der Aggregatfunktion zur Verfügung stehen. Dafür _muss_ man HAVING anwenden.

viele Grüße

Axel