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
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 回答
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 emp 
where rownum <= &upperlimit 
minus 
select * 
from emp 
where rownum <= &lower limit ;
于 2013-09-19T08:23:30.620 回答