特定の範囲の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
CTE with句を使用して行うこともできます。
WITH maps AS (Select ROW_NUMBER() OVER (ORDER BY Id) AS rownum,*
from maps006 )
SELECT rownum, * FROM maps WHERE rownum >49 and rownum <101
select *
from emp
where rownum <= &upperlimit
minus
select *
from emp
where rownum <= &lower limit ;