在Oracle数据库中,ROWNUM和ROW_NUMBER有什么区别?

26

ROWNUMROW_NUMBER有什么不同?

5个回答

42

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

1

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

ROW_NUMBER()似乎是一种为子查询或分区返回的结果集分配行号的函数。


按照顺序排列是可以的,例如:select * from (select a,b,c from foo order by d) where rownum < 10 - Ron
3
@Ron: 试一下吧。你会发现它从整个结果集中获取前10个结果,然后对它们进行排序,这需要付出艰辛的代价。 - Powerlord
@Powerlord:如果我们使用内部查询,则rownum将应用于内部查询结果。 - smali

1

-1

行号从1开始..在条件评估结果为真后增加。 因此,rownum>=1返回表中的所有行


-1

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

row_number是一种分析函数,可以用来按照row_number()函数所规定的顺序对查询返回的行进行编号。


1
“它们按照返回的行的顺序编号”这种说法是不正确的——它们是根据被识别为最终结果集的时间顺序排序的,因此在ORDER BY子句之前进行排序。 - David Aldridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接