web-dev-qa-db-ja.com

SQL ROWNUM特定の範囲の間の行を返す方法

特定の範囲のROWNUM値を返すにはどうすればよいですか?

私は次を試しています:

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

これは、<演算子に一致する行のみを返します。

30
 SELECT * from
 (
 select m.*, rownum r
 from maps006 m
 )
 where r > 49 and r < 101
59
SELECT  *
FROM    (
        SELECT  q.*, rownum rn
        FROM    (
                SELECT  *
                FROM    maps006
                ORDER BY
                        id
                ) q
        )
WHERE   rn BETWEEN 50 AND 100

二重ネストビューに注意してください。 ROWNUMORDER BYの前に評価されるため、正しい番号付けに必要です。

ORDER BY句を省略すると、一貫した順序が得られません。

29
Quassnoi

これは古い質問ですが、最新バージョン新機能に言及すると便利です。

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>
13
Lalit Kumar B

私はこれに対する解決策を探していましたが、これが素晴らしいと思いました 解決策を説明する記事

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;
6
cpomp
SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, * FROM maps006) AS DerivedTable
WHERE RowNum BETWEEN 49 AND 101
2
Ghyath Serhal

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  
2
Pankaj Agarwal
select * 
from emp 
where rownum <= &upperlimit 
minus 
select * 
from emp 
where rownum <= &lower limit ;
2
subrahmanyam j