[英]In an Oracle database, what is the difference between ROWNUM and ROW_NUMBER?
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
與ROW_NUMBER() OVER()
:
從一個小讀數,ROWNUM是Oracle自動分配到一個行集合的值(ORDER之前通過被評估,因此永遠不要ORDER BY ROWNUM
或使用WHERE ROWNUM < 10
與ORDER BY
)。
ROW_NUMBER()似乎是一個函數,用於將行號分配給子查詢或分區返回的結果集。
rownum是一個偽列,可以添加到任何選擇查詢中,對返回的行進行編號(從1開始)。 它們根據何時被識別為最終結果集的一部分進行排序。 ( #ref )
row_number是一個解析函數,可用於按行row_number()函數強制要求的順序對查詢返回的行進行編號。
在條件評估結果為真后,Rownum以1 ..增加開始。 因此rownum> = 1返回表中的所有行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.