Um dieses Verhalten zu erklären, müssen wir verstehen, wie Oracle ROWNUM verarbeitet. Bei der Zuweisung von ROWNUM zu einer Zeile beginnt Oracle bei 1 und erhöht den Wert nur, wenn eine Zeile ausgewählt ist; das heißt, wenn alle Bedingungen in der WHERE-Klausel erfüllt sind. Da unsere Bedingung erfordert, dass ROWNUM größer als 2 ist, werden keine Zeilen ausgewählt und ROWNUM wird nie über 1 hinaus erhöht.
Unterm Strich funktionieren Bedingungen wie die folgenden wie erwartet.
.. WHERE rownum =1;
.. WHERE Zeilennummer <=10;
Während Abfragen mit diesen Bedingungen immer null Zeilen zurückgeben.
.. WHERE rownum =2;
.. WHERE rownum> 10;
Zitiert aus Oracle Rownum verstehen
Sie sollten Ihre Abfrage folgendermaßen ändern, damit sie funktioniert:
select empno
from
(
select empno, rownum as rn
from (
select empno
from emp
order by sal desc
)
)
where rn=2;
BEARBEITEN :Ich habe die Abfrage korrigiert, um die Zeilennummer nach zu erhalten die reihenfolge von sal desc