【问题标题】:SQL ROWNUM how to return rows between a specific rangeSQL ROWNUM如何返回特定范围之间的行
【发布时间】:2011-05-31 23:12:10
【问题描述】:

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

我正在尝试以下方法:

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

这仅返回与&lt; 运算符匹配的行。

【问题讨论】:

标签: sql database oracle rownum


【解决方案1】:
 SELECT * from
 (
 select m.*, rownum r
 from maps006 m
 )
 where r > 49 and r < 101

【讨论】:

  • 为了完整起见,有没有办法去掉后面的r列?
  • 我的快速解决方法是将第一行更改为:SELECT col1,col2,col3 from 其中 col1、col2 等将是除 r 之外的所有列的名称
  • 如果你不给 ROWNUM 一个别名,这在 oracle 上不起作用
  • 如何选择结果集中没有rownum的所有行?
  • 我在 Oracle 中使用这种模式得到了不一致的结果。下面的双嵌套查询解决了这个问题。
【解决方案2】:
SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, * FROM maps006) AS DerivedTable
WHERE RowNum BETWEEN 49 AND 101

【讨论】:

    【解决方案3】:
    SELECT  *
    FROM    (
            SELECT  q.*, rownum rn
            FROM    (
                    SELECT  *
                    FROM    maps006
                    ORDER BY
                            id
                    ) q
            )
    WHERE   rn BETWEEN 50 AND 100
    

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

    如果省略ORDER BY 子句,您将无法获得一致的顺序。

    【讨论】:

    • 当我尝试类似的事情时,我得到“ORA-00904: "RN": invalid identifier"。
    • @RobinGreen:请提出另一个问题并在那里发布“类似的东西”。
    • 我仍然不明白为什么需要双重嵌套。我正在尝试一些数据,它给了我一致的记录。select * from (SELECT tab.*, rownum r FROM table1 tab order by cft.confrm_fraud_id) tab1 WHERE tab1.r BETWEEN 10 AND 20
    • @pramod:那是因为您的查询以confrm_fraud_id 的顺序读取记录,很可能在其上使用索引。你不能依赖这种行为。比较这两个查询:sqlfiddle.com/#!4/4730c5/5(不正确)和sqlfiddle.com/#!4/4730c5/7(正确)。请注意,在不正确的查询中,ROWNUM 的顺序甚至是错误的。
    • 这个解决方案非常适合我。我试图使用ROWNUM BETWEEN 11 AND 20 对具有12 行的结果集进行分页,但得到0 任何以&gt;1 开头的范围的记录。感谢您的提示!
    【解决方案4】:

    您也可以使用 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  
    

    【讨论】:

      【解决方案5】:
      select * 
      from emp 
      where rownum <= &upperlimit 
      minus 
      select * 
      from emp 
      where rownum <= &lower limit ;
      

      【讨论】:

        【解决方案6】:

        我一直在寻找解决方案,发现这很棒 article explaining the solution 相关摘录

        我最喜欢的 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;
        

        【讨论】:

          【解决方案7】:

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

          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>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-28
            • 1970-01-01
            • 2021-07-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多