Vinzenz Mai: Oracle 10g, Select, Order By, gib mir die drittletzte Zeile

Beitrag lesen

Hallo Ilja,

gibt es eine Möglichkeit, mit einem select (natürlich mit order by, so daß eine Ordnung gegeben ist) die drittletzte Zeile der Ergebnis-Menge auszuwählen?

ja, natürlich kann oracle das auch, man muss nur wissen, wie ROWNUM funktioniert. das verwirrende daran ist, wann (zeitlich) ROWNUM vergeben wird, nämlich das ROWNUM -> vor <- der sortierung vergeben wird.

genau das bedingt ja das dreifach verschachtelte SELECT.

das beste ist, die sortietnug mit DESC machen, ROWNUM mit aliasnamen dazu,

wie Du meinen Einzelschritten und Deiner Anmerkung oben entnehmen kannst, führt das *nicht* zum gewünschten Ergebnis:

Damit ROWNUM den richtigen Datensatz numeriert, muss im innersten SELECT absteigend sortiert werden, ROWNUM kann erst in einem SELECT um diesen innersten sortierten SELECT angewandt werden

dann wird auch klar, warum rownum = 3 niemals ergebnise in oracle liefern wird rownum = 1, bzw. rownum <= 3 aber schon. das dbms nimt den ersten datensatz, gibt ihm ROWNUM 1 und prüft dann die WHERE klausel, die besagt nimm nur ROWNUM = 3, also schließt es ihn aus. nun nimmt das dbms den nächsten datensatz und gibt im natürlich wieder die ROWNUM 1 und die ist wieder ungleich 3......

aus diesem Grund muss um dieses Konstrukt noch ein weiteres SELECT außen herum gepackt werden. Erst in diesem ist die gezielte WHERE-Klausel möglich.

=> daraus folgt die Dreifachverschachtelung.

das alles als unterabfrage in der FROM klausel und dann dort in der where klausel mit aliasname = 3 den datensatz auszuwählen.

SELECT t.zeile, t.spalte1, t.spalte2....
FROM (hier die unterabfrage mit rownum AS Zeile) t
WHERE t.zeile = 3
;

Schau' es Dir selbst an. Verfolge Deine eigene Argumentation. Es liefert nicht das gewünschte Ergebnis. Hab' ich getestet.

Freundliche Grüße

Vinzenz