Comment puis-je renvoyer une plage spécifique de valeurs ROWNUM
?
J'essaie ce qui suit:
select * from maps006 where rownum >49 and rownum <101
Cela renvoie uniquement les lignes correspondant à <
opérateur.
SELECT * from
(
select m.*, rownum r
from maps006 m
)
where r > 49 and r < 101
SELECT *
FROM (
SELECT q.*, rownum rn
FROM (
SELECT *
FROM maps006
ORDER BY
id
) q
)
WHERE rn BETWEEN 50 AND 100
Notez la vue imbriquée double. ROWNUM
est évalué avant ORDER BY
, il est donc nécessaire pour une numérotation correcte.
Si vous omettez ORDER BY
clause, vous n'obtiendrez pas d'ordre cohérent.
Je sais que c'est une vieille question, cependant, il est utile de mentionner nouvelles fonctionnalités dans dernière version.
À partir de Oracle 12c, vous pouvez utiliser la nouvelle fonction de limitation des rangées supérieures. Pas besoin d'écrire une sous-requête, pas de dépendance sur ROWNUM.
Par exemple, la requête ci-dessous retournerait les employés entre les 4e et 7e salaires les plus élevés dans l'ordre croissant:
SQL> SELECT empno, sal
2 FROM emp
3 ORDER BY sal
4 OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;
EMPNO SAL
---------- ----------
7654 1250
7934 1300
7844 1500
7499 1600
SQL>
Je cherchais une solution pour cela et j'ai trouvé ça génial article expliquant la solution Extrait pertinent
Mon utilisation préférée de tous les temps de ROWNUM est la pagination. Dans ce cas, j'utilise ROWNUM pour obtenir les lignes N à M d'un jeu de résultats. La forme générale est la suivante:
select * enter code here
from ( select /*+ FIRST_ROWS(n) */
a.*, ROWNUM rnum
from ( your_query_goes_here,
with order by ) a
where ROWNUM <=
:MAX_ROW_TO_FETCH )
where rnum >= :MIN_ROW_TO_FETCH;
Maintenant avec un exemple réel (obtient les lignes 148, 149 et 150):
select *
from
(select a.*, rownum rnum
from
(select id, data
from t
order by id, rowid) a
where rownum <= 150
)
where rnum >= 148;
SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, * FROM maps006) AS DerivedTable
WHERE RowNum BETWEEN 49 AND 101
Vous pouvez également utiliser CTE avec la clause.
WITH maps AS (Select ROW_NUMBER() OVER (ORDER BY Id) AS rownum,*
from maps006 )
SELECT rownum, * FROM maps WHERE rownum >49 and rownum <101
select *
from emp
where rownum <= &upperlimit
minus
select *
from emp
where rownum <= &lower limit ;