Как я могу вернуть определенный диапазон значений ROWNUM?
Я пытаюсь сделать следующее:
select * from maps006 where rownum >49 and rownum <101
Это возвращает только строки, соответствующие оператору <.
Как я могу вернуть определенный диапазон значений ROWNUM?
Я пытаюсь сделать следующее:
select * from maps006 where rownum >49 and rownum <101
Это возвращает только строки, соответствующие оператору <.
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. Не нужно писать подзапрос, никакой зависимости от 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
(SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, * FROM maps006) AS DerivedTable
WHERE RowNum BETWEEN 49 AND 101
select *
from emp
where rownum <= &upperlimit
minus
select *
from emp
where rownum <= &lower limit ;
Вы также можете использовать 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