web-dev-qa-db-fra.com

Sélection de la deuxième ligne d'un tableau avec rownum

J'ai essayé la requête ci-dessous:

select empno from (
                   select empno 
                     from emp
                    order by sal desc
                  )
where rownum = 2

Ceci ne renvoie aucun enregistrement.

Quand j'ai essayé cette requête 

 select rownum,empno from (
                        select empno from emp order by sal desc) 

Cela me donne cette sortie:

ROWNUM  EMPNO      
1       7802        
2       7809    
3       7813    
4       7823

Quelqu'un peut-il me dire quel est le problème avec ma première requête? Pourquoi ne renvoie-t-il aucun enregistrement lorsque j'ajoute le filtre ROWNUM?

20
Gaurav Soni

Pour expliquer ce comportement, nous devons comprendre le processus de traitement Oracle ROWNUM. Lors de l'affectation de ROWNUM à une ligne, Oracle commence à 1 et incrémente uniquement la valeur lorsqu'une ligne est sélectionnée; c'est-à-dire quand tout les conditions de la clause WHERE sont remplies. Depuis notre condition nécessite ROWNUM est supérieur à 2, aucune ligne n'est sélectionnée et ROWNUM est jamais incrémenté au-delà de 1.

L’essentiel est que les conditions suivantes fonctionnent comme attendu.

.. WHERE rownum = 1;

.. WHERE rownum <= 10;

Les requêtes contenant ces conditions ne renverront toujours aucune ligne.

.. WHERE rownum = 2;

.. WHERE rownum> 10;

Cité de Comprendre Oracle rownum

Vous devriez modifier votre requête de cette façon pour pouvoir travailler:

select empno
from
    (
    select empno, rownum as rn 
    from (
          select empno
          from emp
          order by sal desc
          )
    )
where rn=2;

EDIT: j'ai corrigé la requête pour obtenir le rownum après l'ordre par sal desc

49
Florin Ghita

Dans la première requête, la première ligne aura ROWNUM = 1 et sera donc rejetée. La deuxième ligne aura aussi ROWNUM = 1 (parce que la ligne précédente a été rejetée) et sera également rejetée, la troisième ligne aura également ROWNUM = 1 (parce que toutes les lignes précédentes seront rejetées) et sera également rejetée, etc. Le réseau Le résultat est que toutes les lignes sont rejetées.

La deuxième requête ne doit pas renvoyer le résultat obtenu. Il convient d'affecter correctement ROWNUM after ORDER BY.

En conséquence, vous devez utiliser non pas 2 mais 3 niveaux de sous-requêtes, comme ceci:

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

Le résultat:

EMPNO                  SAL                    
---------------------- ---------------------- 
3                      7813                   
8
Branko Dimitrijevic

Pour la nième ligne utilisant rownum dans Oracle:

select * from TEST WHERE ROWNUM<=n
MINUS
select * from TEST WHERE ROWNUM<=(n-1);

Exemple pour la deuxième rangée:

select * from TEST WHERE ROWNUM<=2
MINUS
select * from TEST WHERE ROWNUM<=1;
1
Md. Kamruzzaman

essaye ça:

SELECT ROW_NUMBER() OVER (ORDER BY empno) AS RowNum,
       empno
FROM   tableName
WHERE  RowNumber = 2;

Extrait de source:

SELECT last_name FROM 
      (SELECT last_name, ROW_NUMBER() OVER (ORDER BY last_name) R FROM employees)
WHERE R BETWEEN 51 and 100

R&EACUTE;F&EACUTE;RENCE

1
John Woo

sélectionnez empno parmi (
sélectionnez empno, rownum as rhum
de emp,
commander par sal desc
)
où rhum = 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