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