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