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
请注意双重嵌套视图。 ROWNUM
在ORDER 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