【问题标题】:In an Oracle database, what is the difference between ROWNUM and ROW_NUMBER?在 Oracle 数据库中,ROWNUM 和 ROW_NUMBER 有什么区别?
【发布时间】:2010-09-15 12:47:22
【问题描述】:

ROWNUMROW_NUMBER 有什么区别?

【问题讨论】:

    标签: sql oracle row-number rownum


    【解决方案1】:

    ROWNUM 是一个“伪列”,它为查询返回的每一行分配一个数字:

    SQL> select rownum, ename, deptno
      2  from emp;
    
        ROWNUM ENAME          DEPTNO
    ---------- ---------- ----------
             1 SMITH              99
             2 ALLEN              30
             3 WARD               30
             4 JONES              20
             5 MARTIN             30
             6 BLAKE              30
             7 CLARK              10
             8 SCOTT              20
             9 KING               10
            10 TURNER             30
            11 FORD               20
            12 MILLER             10
    

    ROW_NUMBER 是一个分析函数,它根据在一组行中的顺序为每一行分配一个数字:

    SQL> select ename, deptno, row_number() over (partition by deptno order by ename) rn
      2  from emp;
    
    ENAME          DEPTNO         RN
    ---------- ---------- ----------
    CLARK              10          1
    KING               10          2
    MILLER             10          3
    FORD               20          1
    JONES              20          2
    SCOTT              20          3
    ALLEN              30          1
    BLAKE              30          2
    MARTIN             30          3
    TURNER             30          4
    WARD               30          5
    SMITH              99          1
    

    【讨论】:

      【解决方案2】:

      从一点阅读来看,ROWNUM 是 Oracle 自动分配给行集的值(在评估 ORDER BY 之前,所以不要永远 ORDER BY ROWNUM 或使用WHERE ROWNUM < 10 ORDER BY)。

      ROW_NUMBER() 似乎是一个函数,用于将行号分配给子查询或分区返回的结果集。

      【讨论】:

      • order by 可以,例如 select * from (select a,b,c from foo order by d) where rownum
      • @Ron:试试看。您会发现它从整个结果集中获取前 10 个结果,然后对它们排序。
      • @Powerlord:如果我们使用内部查询,那么 rownum 将应用于内部查询的结果
      【解决方案3】:

      rownum 是一个伪列,可以添加到任何选择查询中,对返回的行进行编号(从 1 开始)。它们根据何时被识别为最终结果集的一部分进行排序。 (#ref)

      row_number 是一个解析函数,可用于按照 row_number() 函数规定的顺序对查询返回的行进行编号。

      【讨论】:

      • -1 表示“它们按照返回行的顺序编号”。不正确——它们是根据它们被识别为最终结果集的一部分的时间排序的,所以它在 ORDER BY 子句之前
      【解决方案4】:

      除了答案中提到的其他差异外,您还应该考虑性能。这里有一份非权威但很有趣的报道,比较了各种分页方式,其中ROWNUM的使用与ROW_NUMBER() OVER()的使用对比:

      http://www.inf.unideb.hu/~gabora/pagination/results.html

      【讨论】:

        【解决方案5】:

        Rownum 以 1 开头..在条件评估结果为 true 后增加。 因此 rownum >=1 返回表中的所有行

        【讨论】:

          猜你喜欢
          • 2015-01-29
          • 2014-04-05
          • 2014-03-12
          • 2014-10-20
          • 2021-04-09
          • 2011-04-04
          • 2011-12-08
          • 2016-03-13
          相关资源
          最近更新 更多