В чем разница между 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 () кажется функцией для присвоения номеров строк результирующему набору, возвращаемому подзапросом или разделом.
@Ron: Попробуй. Вы узнаете на собственном опыте, что он берет первые 10 результатов из всего набора результатов, а затем их упорядочивает.
@Powerlord: если мы используем внутренний запрос, тогда rownum будет применяться к результату внутреннего запроса
Rownum - это псевдостолбец, который можно добавить в любой запрос выбора для нумерации возвращаемых строк (начиная с 1). Они упорядочены в соответствии с тем, когда они были определены как часть окончательного набора результатов. (#ref)
row_number - это аналитическая функция, которую можно использовать для нумерации строк, возвращаемых запросом, в порядке, установленном функцией row_number ().
-1 для «Они пронумерованы в порядке возврата строк». Неправда - они упорядочены в соответствии с тем, когда они были идентифицированы как часть окончательного набора результатов, так что это до предложения ORDER BY
Помимо других различий, упомянутых в ответах, вам также следует учитывать производительность. Здесь есть неавторитетный, но очень интересный отчет, в котором сравниваются различные средства разбивки на страницы, среди которых использование ROWNUM по сравнению с ROW_NUMBER() OVER():
Rownum начинается с 1 ... увеличивается после того, как результаты оценки условия становятся истинными. Следовательно, rownum> = 1 возвращает все строки в таблице
порядок по в порядке, например, выберите * из (выберите a, b, c из foo порядок по d), где rownum <10