wake-up-neo.net

Auswahl der zweiten Zeile einer Tabelle mit Hilfe von Rownum

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?

20
Gaurav Soni

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

49
Florin Ghita

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                   
8

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;
1
Md. Kamruzzaman

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

REFERENZ

1
John Woo

wählen Sie Empno aus (
wähle empno, rownum als rum
von emp,
bestellen nach sal ab
)
wobei rum = 2;

0
Deepak R
Select * From (SELECT *,
  ROW_NUMBER() OVER(ORDER BY column_name  DESC) AS mRow

FROM table_name 

WHERE condition) as TT
Where TT.mRow=2;
0
Sachin Patil