ROWNUM
和ROW_NUMBER
有什么不同?
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
从一些阅读来看,ROWNUM是Oracle自动为行集分配的值(在ORDER BY被评估之前),所以不要永远ORDER BY ROWNUM
或使用WHERE ROWNUM < 10
与ORDER BY
)。
ROW_NUMBER()似乎是一种为子查询或分区返回的结果集分配行号的函数。
ROWNUM
与 ROW_NUMBER() OVER()
的比较:
行号从1开始..在条件评估结果为真后增加。 因此,rownum>=1返回表中的所有行
rownum是一个伪列,可以添加到任何select查询中,对返回的行进行编号(从1开始)。它们按照它们被识别为最终结果集的一部分的时间顺序排序。(#ref)
row_number是一种分析函数,可以用来按照row_number()函数所规定的顺序对查询返回的行进行编号。