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

cod*_*441 31 sql database oracle rownum

如何返回特定范围的ROWNUM值?

我正在尝试以下方法:

select * from maps006 where rownum >49 and rownum <101
Run Code Online (Sandbox Code Playgroud)

这仅返回与<运算符匹配的行.

Mic*_*sov 61

 SELECT * from
 (
 select m.*, rownum r
 from maps006 m
 )
 where r > 49 and r < 101
Run Code Online (Sandbox Code Playgroud)

  • 我的快速解决方法是将第一行更改为:`SELECT col1,col2,col3 from`其中col1,col2等将是除r之外的所有列的名称 (3认同)
  • 如果你不给ROWNUM一个别名,这对oracle不起作用 (2认同)
  • 如何在结果集中选择没有rownum的所有行? (2认同)

Qua*_*noi 30

SELECT  *
FROM    (
        SELECT  q.*, rownum rn
        FROM    (
                SELECT  *
                FROM    maps006
                ORDER BY
                        id
                ) q
        )
WHERE   rn BETWEEN 50 AND 100
Run Code Online (Sandbox Code Playgroud)

请注意双嵌套视图.ROWNUM之前进行过评估ORDER BY,因此需要正确的编号.

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


Lal*_*r B 13

我知道这是一个老问题,但是,更何况它是有用的新功能最新版本.

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>
Run Code Online (Sandbox Code Playgroud)


小智 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;
Run Code Online (Sandbox Code Playgroud)

现在有一个真实的示例(获取行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;
Run Code Online (Sandbox Code Playgroud)