Sven Rautenberg: select max() geht nicht

Beitrag lesen

Moin!

Es ist daher Unsinn in diesem konkreten Beispiel, das unverändert bleibende Datenfeld "Ort" aus WHERE in HAVING zu verlagern. Das führt nur dazu, dass außer dem gewählten Ort auch alle anderen Orte in die Gruppierungsphase einfließen,
Das tun sie, je nach internem Ablauf in der Datenbank, sowieso. Kennst Du Dich wirklich so gut mit den DB-Interna aus, dass Du das so behaupten kannst?

Die tatsächliche Implementierung eines Querys, nachdem alle Analyzer, Optimizer etc. drübergelaufen sind, und die Datenbank dann anfängt, ist für mich recht irrelevant. Der Querystring-Optimierungsprozess kann bei guten Querys noch ein wenig mehr Speed bringen, bei schlechten Querys die gröbsten Schnitzer ausbaden.

MS Access SQL bringt jedenfalls bei

SELECT id, Ort, Max(woche) AS MaxWoche, Max(Jahr) AS MaxJahr
FROM Tabelle2
WHERE Ort = "o1"
GROUP BY id;

die Fehlermeldung, dass nicht nach Ort gruppiert wird.

Das hat aber nichts mit WHERE oder HAVING zu tun. Auch mit der Datensatzauswahl in HAVING würde die Meldung kommen. Aus grundsätzlichen Syntaxüberlegungen heraus.

Das ist ja auch richtig, da Ort als Feld direkt angesprochen wird und nicht per Aggregatfunktion. Es _könnte_ aber auch darauf hinweisen, dass trotz WHERE, welches ja _einen_ Ort vorgibt, eben immer _erst_ gruppiert wird.

Ein Optimizer müßte dann ja erkennen, dass die WHERE-Klausel nur zu einem einzigen Ort führen kann, weshalb in diesem speziellen Fall dann die Aufführung des Ortes in SELECT erlaubt ist, obwohl nicht nach ihm gruppiert und auch keine Aggregatfunktion drauf angewendet wird.

Das könnte man als SQL-Schreiber dann noch simpler machen:
SELECT if, 'o1', max(woche) as MaxWoche, max(Jahr) as MaxJahr ...(Rest wie gehabt). Einfach den fixen String ins SELECT tun, und fertig.

Ich halte jedenfalls viel davon, in den Querys die grundsätzlichen Ideen und Vorgaben, die SQL mit sich bringt, einzuhalten. Es hat schließlich einen Grund, warum die Reihenfolge der diversen Kommandos im SELECT eine Rolle spielt.

- Sven Rautenberg

--
"Love your nation - respect the others."