In einer SQL Übungsaufgabe soll ich die Zeile ausgeben, die in einer Spalte den fünftgrößten Wert hat. Als Server läuft Oracle Database.
Leider unterstützt der Server nicht alle Befehle, die man auch von MySQL kennt und somit gibt es auch kein Limit-Befehl.
Die Aufgabe selbst soll mit einer Unterabfrage gelöst werden. Ich steh da irgendwie auf dem Schlauch. Kann da vielleicht jemand ein Tipp geben?
...
Ich hätte da auch aufm Schlauch gestanden, aber weil mich das gerade interessiert hat, hab ich mal gegooglet und bin erst auf diesen Blogeintrag und später auf diesen Artikel von Oracle gestoßen. Solltest du dir nicht gleich die Lösung auf dem Silbertablett präsentieren lassen wollen: Der Trick heißt wohl ROWNUM. So wie ich das verstehe, ginge das dann so:
Sollte eigentlich auch ohne solche Spezialkonstrukte gehen (kann ich jetzt für Oracle natürlich nicht garantieren).
Überleg mal, was du suchst, ist die Zeile x, wo die Anzahl der Zeilen, bei denen ein bestimmter Wert kleiner ist als der der Zeile x, 4 ist.
Kleiner Hint: Die Anzahl zählt man mit...
COUNT
Mal die Lösung, die ich spontan auf meiner WebSeiten-Datenbank gemacht habe (Tabelle heißt hier "page", die Spalte, nach der verglichen wird, ist die page_id):
SELECT * FROM page p WHERE (SELECT count(*) FROM page q WHERE q.page_id < p.page_id) = 4;
(Wie schon geschrieben: Selektiere die Zeile, wo die Anzahl der Zeilen, bei denen die page_id kleienr ist, gleich 4 ist, was dann natürlich die 5. Zeile ist)
Das sollte für große Datenbanken schneller sein, wenn ich richtig liege, ist aber weniger elegant, da die Kolumnen explizit angegeben werden müssen. Was es macht ist folgendes:
1. Wähle alles aus tab und sortiere absteigend nach coln.
2. Wähle die ersten 5 Reihen.
3. Wähle die 5. Reihe.