SQL ROWNUM, как вернуть строки между определенным диапазоном - PullRequest
27 голосов
/ 29 декабря 2010

Как я могу вернуть определенный диапазон значений ROWNUM?

Я пытаюсь сделать следующее:

select * from maps006 where rownum >49 and rownum <101

Возвращает только строки, соответствующие оператору <.

Ответы [ 7 ]

55 голосов
/ 29 декабря 2010
 SELECT * from
 (
 select m.*, rownum r
 from maps006 m
 )
 where r > 49 and r < 101
24 голосов
/ 29 декабря 2010
SELECT  *
FROM    (
        SELECT  q.*, rownum rn
        FROM    (
                SELECT  *
                FROM    maps006
                ORDER BY
                        id
                ) q
        )
WHERE   rn BETWEEN 50 AND 100

Обратите внимание на двойное вложенное представление. ROWNUM оценивается до ORDER BY, поэтому требуется для правильной нумерации.

Если вы пропустите предложение ORDER BY, вы не получите последовательный заказ.

11 голосов
/ 19 мая 2015

Я знаю, что это старый вопрос, однако полезно упомянуть новые функции в последней версии .

Начиная с Oracle 12c и далее, вы можете использовать новую функцию ограничения Top-n Row .Нет необходимости писать подзапрос, нет зависимости от ROWNUM.

Например, приведенный ниже запрос вернет сотрудников между 4-й самой высокой и 7-й самой высокой зарплатой в порядке возрастания:

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>
5 голосов
/ 20 декабря 2013

Я искал решение для этого и нашел это великое статья, объясняющая решение Соответствующая выдержка

Мое любимое использование ROWNUM - это нумерация страниц. В этом случае я использую ROWNUM, чтобы получить строки с N по M набора результатов. Общая форма как следующим образом:

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;

Теперь с реальным примером (получает строки 148, 149 и 150):

select *
    from
  (select a.*, rownum rnum
     from
  (select id, data
     from t
   order by id, rowid) a
   where rownum <= 150
  )
   where rnum >= 148;
2 голосов
/ 19 сентября 2013
select * 
from emp 
where rownum <= &upperlimit 
minus 
select * 
from emp 
where rownum <= &lower limit ;
2 голосов
/ 29 декабря 2010

Вы также можете использовать CTE с предложением.

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 голосов
/ 29 декабря 2010
SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, * FROM maps006) AS DerivedTable
WHERE RowNum BETWEEN 49 AND 101
...