web-dev-qa-db-fra.com

SQL ROWNUM comment retourner des lignes entre une plage spécifique

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.

30
code511788465541441
 SELECT * from
 (
 select m.*, rownum r
 from maps006 m
 )
 where r > 49 and r < 101
59
Michael Pakhantsov
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.

29
Quassnoi

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>
13
Lalit Kumar B

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;
6
cpomp
SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, * FROM maps006) AS DerivedTable
WHERE RowNum BETWEEN 49 AND 101
2
Ghyath Serhal

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  
2
Pankaj Agarwal
select * 
from emp 
where rownum <= &upperlimit 
minus 
select * 
from emp 
where rownum <= &lower limit ;
2
subrahmanyam j