В чем разница между ROWNUM
и ROW_NUMBER
?
В базе данных Oracle какая разница между ROWNUM и ROW_NUMBER?
Ответ 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() представляется функцией назначения номеров строк в результирующий набор, возвращаемый подзапросом или разделом.
Ответ 3
Помимо других различий, упомянутых в ответах, вы также должны учитывать производительность. Здесь есть не авторитетный, но очень интересный отчет, сравнивающий различные способы разбивки на страницы, среди которых использование ROWNUM
по сравнению с ROW_NUMBER() OVER()
:
Ответ 4
rownum - это псевдоколонка, которая может быть добавлена в любой запрос выбора, чтобы число возвращаемых строк (начиная с 1). Они упорядочены в соответствии с тем, когда они были идентифицированы как часть окончательного набора результатов. (#ref)
row_number - аналитическая функция, которая может использоваться для номера строк, возвращаемых запросом, в порядке, заданном row_number().
Ответ 5
Rownum начинается с 1.. увеличивается после того, как условие оценило результаты на true. Следовательно rownum >= 1 возвращает все строки в таблице