Quelle est la différence entre ROWNUM
et ROW_NUMBER
?Dans une base de données Oracle, quelle est la différence entre ROWNUM et ROW_NUMBER?
Répondre
ROWNUM est un « pseudo-colonne » qui attribue un numéro à chaque ligne renvoyée par une requête:
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 est une fonction analytique qui attribue un numéro à chaque ligne en fonction de sa commande dans un groupe de lignes :
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
d'un peu de lecture, ROWNUM est une valeur attribuée automatiquement par Oracle à un ensemble de lignes (avant ORDER BY en cours d'évaluation, donc ne jamaisORDER BY ROWNUM
ou utilisez un WHERE ROWNUM < 10
avec un ORDER BY
).
ROW_NUMBER() semble être une fonction permettant d'attribuer des numéros de lignes à un ensemble de résultats renvoyé par une sous-requête ou une partition.
rownum est une pseudocolonne qui peut être ajoutée à n'importe quelle requête de sélection, pour numéroter les lignes retournées (en commençant par 1). Ils sont classés en fonction du moment où ils ont été identifiés comme faisant partie du jeu de résultats final. (#ref)
row_number est une fonction d'analyse, qui peut être utilisée pour numéroter les lignes renvoyées par la requête dans un ordre mandaté par la fonction row_number().
-1 pour "Ils sont numérotés dans l'ordre dans lequel les lignes sont retournées". Pas vrai - ils sont classés en fonction du moment où ils ont été identifiés comme faisant partie du jeu de résultats final, donc c'est avant une clause ORDER BY –
En dehors des autres différences mentionnées dans les réponses, vous devriez également considérer la performance. Il y a un non-autorité, mais très intéressant rapport ici, en comparant divers moyens de pagination, parmi lesquels l'utilisation de ROWNUM
par rapport à ROW_NUMBER() OVER()
:
ROWNUM commence par 1 ..increases après l'état évalué les résultats true . Ainsi rownum> = 1 renvoie toutes les lignes du tableau
par ordre est correct, par exemple, select * from (choisir a, b, c de l'ordre de foo par d) où rownum <10 – Ron
@Ron: essayer. Vous découvrirez à la dure qu'il prend les 10 premiers résultats de l'ensemble des résultats, puis les commande. – Powerlord
@Powerlord: si nous utilisons une requête interne alors rownum sera appliqué sur le résultat de la requête interne – Ali786