SQL ROWNUM如何在特定范围之间返回行

我怎样才能返回一个特定范围的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 

请注意双重嵌套视图。 ROWNUMORDER BY之前被评估,所以正确的编号是必需的。

如果您省略ORDER BY子句,则不会获得一致的顺序。

我知道这是一个老问题,但是,在最新版本中提及新function是有用的。

Oracle 12c起,您可以使用新的Top-n Row限制function 。 无需编写子查询,不需要依赖ROWNUM。

例如,下面的查询将按照从小到大的顺序返回第四高到第七高的员工:

 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> 

我正在寻找这个解决scheme,并发现这个伟大的文章解释解决scheme相关摘录

我最喜欢的ROWNUM的使用是分页。 在这种情况下,我使用ROWNUM来获取结果集的N到M行。 一般forms如下:

 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