Hallo Hopsel,
Ich habe mal wieder ein eher einfaches Problem.
Nehmen wir an, ich habe eine sehr einfache Tabelle
test
:
Ich möchte jetzt alle Werte so haben, wie sie folgende Abfrage ausgibt:
(SELECT id,wert -- gib mir "id" und "wert"
FROM test -- aus der Tabelle test
WHERE wert IS NOT NULL -- wo "wert" nicht NULL ist
GROUP BY wert -- und gruppiere nach "wert"
HAVING MIN(id)) -- wobei ich immer den wert haben möchte,
-- der die kleinste id hat
Macht das überhaupt Sinn?
nein.
Ich hege die Befürchtung, dass Du überhaupt nicht verstanden hast, was eine Gruppierung machen soll. Du hast auch nicht verstanden, was die HAVING-Klausel bewirkt.
id (autoincrement, primary) | wert (integer, NULL erlaubt)
——————————————————————————————————————————————————————————————
1 9
2 83
3 NULL
4 92
5 NULL
6 NULL
7 92
8 92
Welches Ergebnis möchtest Du bei Deinen Beispieldaten haben?
Möchtest Du
id | wert
1 | 9
2 | 83
4 | 92
3 | NULL
haben? Das bekämst Du mit
[code lang=sql]SELECT
MIN(id),
wert
FROM
tabelle
GROUP BY
wert
ORDER BY
MIN(id)
Möchtest Du ein anderes Ergebnis, so gib es an und begründe, warum Du genau diese Daten haben möchtest.
Möchtest Du hingegen \*alle\* ids mit NULL-werten, so wäre eine UNION angebracht. Auf jeden Fall ist es eine gute Idee, die erste Abfrage Deiner UNION entsprechend meinem Vorschlag umzuschreiben.
Wenn Dein Statement die von Dir gewünschten Daten liefert, dann ist dies einfacher Zufall. Beachte, dass bei Deiner Abfrage
id | wert
\----------
1 | 9
2 | 83
7 | 92
selbstverständlich ein erlaubtes Ergebnis von
~~~sql
» SELECT id,wert -- gib mir "id" und "wert"
> FROM test -- aus der Tabelle test
> WHERE wert IS NOT NULL -- wo "wert" nicht NULL ist
> GROUP BY wert -- und gruppiere nach "wert"
> HAVING MIN(id) -- wobei ich immer den wert haben möchte,
> -- der die kleinste id hat
ist, denn MIN(7) ist wahr. Was in Deinem Kommentar steht, ist Wunschdenken, keine Anweisung an die DB. Wenn Du den kleinsten Wert haben willst, wende die entsprechende Aggregatsfunktion auf die Spalte an, aus der Du den kleinsten Wert je Gruppe benötigst. Benötigst Du noch weitere Informationen aus dem Datensatz mit diesem kleinsten Wert, so benötigst Du eine korrelierte Unterabfrage.
Von allen DBMS, die ich kenne, ist nur MySQL so schlampig, solche fehlerhaften Statements auszuführen. Da in vielen Fällen zufällig(!) das gewünschte Ergebnis rauskommt, glaubt der SQL-Novize (der nur MySQL kennt), sein Statement sei in Ordnung - und wundert sich, wenn mal was anderes rauskommt.
Freundliche Grüße
Vinzenz