Ich habe die folgende Abfrage ausprobiert:
select empno from (
select empno
from emp
order by sal desc
)
where rownum = 2
Dies gibt keine Datensätze zurück.
Als ich diese Abfrage ausprobierte
select rownum,empno from (
select empno from emp order by sal desc)
Es gibt mir diese Ausgabe:
ROWNUM EMPNO
1 7802
2 7809
3 7813
4 7823
Kann mir jemand sagen, was bei meiner ersten Anfrage das Problem ist? Warum gibt es keine Datensätze zurück, wenn ich den ROWNUM-Filter hinzufüge?
Um dieses Verhalten zu erläutern, müssen wir verstehen, wie Oracle verarbeitet ROWNUM. Bei der Zuweisung von ROWNUM zu einer Zeile beginnt Oracle bei 1 und erhöht den Wert nur, wenn eine Zeile ausgewählt wird; das heißt, wenn alle Bedingungen in der WHERE-Klausel sind erfüllt. Da unser Zustand .__ erfordert. dass ROWNUM größer als 2 ist, werden keine Zeilen ausgewählt und ROWNUM ist niemals über 1 hinaus erhöht.
Unter dem Strich funktionieren Bedingungen wie die folgenden als erwartet.
.. WO Rownum = 1;
.. WO Rownum <= 10;
Während Abfragen mit diesen Bedingungen immer Nullzeilen zurückgeben.
.. WO Rownum = 2;
.. WO Rownum> 10;
Zitiert aus Oracle-Rownum verstehen
Sie sollten Ihre Abfrage auf diese Weise ändern, um zu funktionieren:
select empno
from
(
select empno, rownum as rn
from (
select empno
from emp
order by sal desc
)
)
where rn=2;
EDIT: Ich habe die Abfrage korrigiert, um das Rownum nach der Reihenfolge von sal desc zu erhalten
In der erste Abfrage hat die erste Zeile ROWNUM = 1 und wird daher zurückgewiesen. Die zweite Zeile hat ebenfalls ROWNUM = 1 (weil die vorherige Zeile abgelehnt wurde) und auch abgelehnt wird. Die dritte Zeile hat auch ROWNUM = 1 (weil alle vorherigen Zeilen abgelehnt wurden) und auch abgelehnt werden usw. Das Netz Das Ergebnis ist, dass alle Zeilen abgelehnt werden.
Die zweite Abfrage sollte nicht das Ergebnis liefern, das Sie erhalten haben. Es sollte ROWNUM nach ORDER BY korrekt zuweisen.
Infolgedessen müssen Sie nicht zwei, sondern drei Ebenen von Unterabfragen verwenden:
SELECT EMPNO, SAL FROM ( -- Make sure row is not rejected before next ROWNUM can be assigned.
SELECT EMPNO, SAL, ROWNUM R FROM ( -- Make sure ROWNUM is assigned after ORDER BY.
SELECT EMPNO, SAL
FROM EMP
ORDER BY SAL DESC
)
)
WHERE R = 2
Das Ergebnis:
EMPNO SAL
---------------------- ----------------------
3 7813
Für die n-te Zeile unter Verwendung von Rownum in Oracle:
select * from TEST WHERE ROWNUM<=n
MINUS
select * from TEST WHERE ROWNUM<=(n-1);
Beispiel für die zweite Reihe:
select * from TEST WHERE ROWNUM<=2
MINUS
select * from TEST WHERE ROWNUM<=1;
versuche dies:
SELECT ROW_NUMBER() OVER (ORDER BY empno) AS RowNum,
empno
FROM tableName
WHERE RowNumber = 2;
Ausschnitt aus Quelle:
SELECT last_name FROM
(SELECT last_name, ROW_NUMBER() OVER (ORDER BY last_name) R FROM employees)
WHERE R BETWEEN 51 and 100
wählen Sie Empno aus (
wähle empno, rownum als rum
von emp,
bestellen nach sal ab
)
wobei rum = 2;
Select * From (SELECT *,
ROW_NUMBER() OVER(ORDER BY column_name DESC) AS mRow
FROM table_name
WHERE condition) as TT
Where TT.mRow=2;