Oracle
 sql >> Base de données >  >> RDS >> Oracle

L'instruction Rownum renvoie une ligne différente de celle sans elle

Votre problème est causé par le fait que le where la clause est appliquée avant order by .

Vous pouvez contourner le problème en triant d'abord puis en appliquant rownum :

select * from (
    select deptno from emp 
     where job='CLERK' 
     group by deptno 
    having count(job)=(select min(count(job)) from emp where job='CLERK'group by deptno) 
     order by deptno) 
where rownum=1;

Remarque :

Ce problème est spécifique à Oracle. MS SQL Server TOP et MySQL LIMIT sont tous deux appliqués après le order by clause.

Remarque 2 :

Dans Oracle Database 12c ( 12.1), il y a une nouvelle fonctionnalité pour sélectionner les lignes k à k+m , offset k rows fetch next m rows only . Je recommanderais de l'utiliser à la place de la solution ci-dessus. Merci à Lalit Kumar B de l'avoir signalé.

select deptno from emp 
 where job='CLERK' 
 group by deptno 
having count(job)=(select min(count(job)) from emp where job='CLERK'group by deptno) 
order by deptno
fetch next 1 rows only

Mais que se passe-t-il s'il y a deux départements (ou plus) avec le même numéro ? Ne vous inquiétez pas, il existe une variante qui renvoie tous les liens :

select deptno from emp 
 where job='CLERK' 
 group by deptno 
having count(job)=(select min(count(job)) from emp where job='CLERK'group by deptno) 
order by deptno
fetch next 1 rows with ties