SQL ROWNUM, как вернуть строки между определенным диапазоном

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

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

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

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

7 ответов

Решение
 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

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

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

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

Начиная с 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>

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

Мое любимое использование 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;
select * 
from emp 
where rownum <= &upperlimit 
minus 
select * 
from emp 
where rownum <= &lower limit ;
SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, * FROM maps006) AS DerivedTable
WHERE RowNum BETWEEN 49 AND 101

Вы также можете использовать 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  
Другие вопросы по тегам