37

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

私は次のことを試しています:

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

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

4

7 に答える 7

71
 SELECT * from
 (
 select m.*, rownum r
 from maps006 m
 )
 where r > 49 and r < 101
于 2010-12-29T09:07:30.630 に答える
31
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と、一貫した順序が得られません。

于 2010-12-29T09:10:55.683 に答える
16

これは古い質問であることは承知していますが、最新バージョンの新機能について言及すると便利です。

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>
于 2015-05-19T09:48:22.377 に答える
6

私はこれに対する解決策を探していましたが、解決策を 説明するこの素晴らしい記事を見つけました 関連する抜粋

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;
于 2013-12-20T19:15:53.063 に答える
2

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  
于 2010-12-29T09:12:43.737 に答える
2
SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, * FROM maps006) AS DerivedTable
WHERE RowNum BETWEEN 49 AND 101
于 2010-12-29T09:09:21.263 に答える