Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

 SELECT * from
 (
 select m.*, rownum r
 from maps006 m
 )
 where r > 49 and r < 101

Ответ 2

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, вы не получите последовательный порядок.

Ответ 3

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

Начиная с Oracle 12c, вы можете использовать новую функцию ограничения строки Top-n. Не нужно писать подзапрос, никакой зависимости от 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>

Ответ 4

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

Мое любимое использование 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;

Ответ 5

SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, * FROM maps006) AS DerivedTable
WHERE RowNum BETWEEN 49 AND 101

Ответ 6

select * 
from emp 
where rownum <= &upperlimit 
minus 
select * 
from emp 
where rownum <= &lower limit ;

Ответ 7

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