kleine Lernhilfe I
-
Also ich wollte folgende Aufgabe lösen:
Es existiert eine Tabelle mit verschiedenen Namen.
Ich möchte den Namen wissen der in alphabetischer Reihenfolge zuletzt käme.Mein naiver Ansatz war:
SELECT name FROM Test WHERE name = MAX(name)
Das hat nicht funktioniert, so dass mir dann nur
SELECT name FROM Test WHERE name = ( SELECT MAX(name) FROM Test )
einfiel was auch funktioniert hat.
Nur das Warum ist mir nicht ganz klar, er hat die illegale Nutzung einer Aggregatsfunktion angekreidet.
In der Klausur werde ich aber keinen Compiler haben der mir sinnvolle Fehlermeldungen gibt.Kann mir jemand erklären wie ich so was erkenne oder gibts es eine Merkregel?
____________________________Es werden bei meinen Studien sicherlich noch andere Fragen auftauchen die ich dann auch in diesen Thread stellen werde, wenn das recht ist.
-
Nächstes mal fällt dir vielleicht sogar das ein:
SELECT MAX(name) FROM Test
-
ja da habe ich doch einen wesentlichen teil der aufgabe gekürzt ^^
Aber mir geht es viel mehr darum:
Warum funktioniert der erste Ansatz nicht?
-
Gegenfrage: Wie soll der erste Ansatz denn funktionieren?
Max möchte gerne das Maximum aus einer Ergebnismenge nehmen.
Diese Menge gibst du aber nicht an, bzw. du erwartest, dass der Sql-Server einfach die komplette, ungefilterte Test-Tabelle nehmen soll.
-
genau das ist doch was ich will, oder?
ob ich jetzt hinschreibeSELECT MAX(name)
FROM Testoder MAX(name)
dürfte doch eigentlich keinen großen unterschied machen, oder?
Schließlich ist die Tabelle ja immer noch die selbe und filtern tu ich ja auch nichts im Grunde.
-
Hinter dem 'where' wird ja gefiltert und du willst da eine Aggregatfunktion nutzen,
die die gefilterten Daten nutzt.
Also dort wo gefiltert wird, nutzt du die Funktion, die gefilterte Daten brauch. Das passt doch nicht.
Nutz doch einfach als Merkregel, dass Aggregatfunktionen nur auf Ergebnisspalten angewendet werden dürfen. SELECT ...fkt(spalte)...FROM
-
SELECT name FROM XY ORDER BY name DESC