PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MSSQL Max vs. Top 1 Datum?


Matrix316
2019-08-23, 18:00:12
Kann mir jemand erklären, warum

select max(datum) from tabelle where 1=2

eine Zeile zurück gibt (mit NULL im Wert) und nicht eine leere Zeile wie

select top 1 datum from tabelle where 1=2 order by datum desc

???

PatkIllA
2019-08-23, 18:15:59
Leere Zeile? Das letzte sollte einfach gar keine Zeile zurück geben.

Matrix316
2019-08-23, 18:16:52
Leere Zeile? Das letzte sollte einfach gar keine Zeile zurück geben.
Mein ich ja. Kommt beim zweiten Select mit top 1 auch so.

Aber mit Max Datum kommt eine Zeile zurück wo NULL drinnen steht. =) Und das finde ich sehr bedenklich...

PatkIllA
2019-08-23, 18:21:02
Das erste ist eine Skalarfunktion oder Aggregation. Und die hat immer einen Rückgabewert.
Das zweite schränkt einfach die Ergebnismenge ein.

Demirug
2019-08-23, 18:23:45
Mein ich ja. Kommt beim zweiten Select mit top 1 auch so.

Aber mit Max Datum kommt eine Zeile zurück wo NULL drinnen steht. =) Und das finde ich sehr bedenklich...

Enspricht doch der Dokumentation

https://docs.microsoft.com/en-us/sql/t-sql/functions/max-transact-sql?view=sql-server-2017

"MAX returns NULL when there is no row to select."

Matrix316
2019-08-23, 18:23:52
Das erste ist eine Skalarfunktion oder Aggregation. Und die hat immer einen Rückgabewert.
Das zweite schränkt einfach die Ergebnismenge ein.

Das erste ist doch genauso ein Select wie die zweite. Nur halt mit einer Skalarfunktion drinnen. :freak: Warum zum Geier kommt da ein Ergebnis raus? Das ist doch brandgefährlich. Ich hab doch garkeinen Wert für die Funktion. Warum sollte da was zurückkommen?

PatkIllA
2019-08-23, 18:34:51
Das erste ist doch genauso ein Select wie die zweite. Nur halt mit einer Skalarfunktion drinnen. :freak: Warum zum Geier kommt da ein Ergebnis raus? Das ist doch brandgefährlich. Ich hab doch garkeinen Wert für die Funktion. Warum sollte da was zurückkommen?
Du selektierst was völlig anderes. Da kommt halt eine Tabelle mit einer Zeile und Spalte zurück.
Funktionen geben üblicherweise immer genau einen Wert zurück.

Matrix316
2019-08-23, 22:45:47
Aber man nutzt ja sowas wie max() nicht immer standalone, sondern auch mit sowas:

select spalte1,spalte2,spalte3,max(spalte4) from tabelle where 1=2 group by spalte1,spalte2,spalte3

Jetzt krieg ich eine Ergebniszeile obwohl ich eigentlich garkeine hätte kriegen sollen.

Ganon
2019-08-24, 00:02:41
GROUP BY filtert NULL Werte nicht raus, sondern behandelt sie wie alle anderen Werte auch. Und da das MAX dort ebenso einen NULL Wert liefert, ist es auch enthalten. Vermutlich triggerst du aber mit deinem 1=2 auch irgend einen Corner-Case...

Matrix316
2019-08-27, 13:09:30
GROUP BY filtert NULL Werte nicht raus, sondern behandelt sie wie alle anderen Werte auch. Und da das MAX dort ebenso einen NULL Wert liefert, ist es auch enthalten. Vermutlich triggerst du aber mit deinem 1=2 auch irgend einen Corner-Case...
Das 1=2 ist nur da, damit man eigentlich nix kriegt.

Ich hatte hier in einer Anwendung halt eine Abfrage gemacht wo ich kein Ergebnis erwartet hätte, aber durch das Max hatte ich ein Ergebnis und dann wurde am Ende ein falscher Wert angezeigt...

][immy
2019-08-27, 14:44:46
Wie schon geschrieben wurde. Mit der Max Funktion bekommst du auf jeden Fall immer was zurück, denn diese Funktion gibt genau einen Wert zurück und da bleibt dann nur Null übrig.
Ohne das Max bekommst du ja quasi Zeilen mit allen Werten zurück wo es 0 Ergebnisse gibt, dementsprechend brauch sie auch nichts zurück geben (wobei sie gibt natürlich was zurück und zwar das es 0 Ergebnisse gibt).

Daher bekommst du dann, wenn du Max irgendwo verwendet auch immer ein Ergebnis, denn "null" ist halt auch relevant.
Du könntest das ganze höchstens mit einer weiteren Abfrage verbinden wo du etwas aus deinem Ergebnis selektierst, wo der max-wert nicht null ist und dieses dann als Attribut in deine Zeile aufnehmen.