Oracle
 sql >> Database >  >> RDS >> Oracle

L'istruzione Rownum restituisce una riga diversa rispetto a quella senza di essa

Il tuo problema è causato dal fatto che where la clausola è applicata prima di order by .

Puoi aggirare il problema ordinando prima e poi applicando 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;

Nota:

Questo problema è specifico di Oracle. MS SQL Server TOP e MySQL LIMIT vengono entrambi applicati dopo order by clausola.

Nota 2:

In Oracle Database 12c ( 12.1), c'è una nuova funzionalità per selezionare le righe da k a k+m , offset k rows fetch next m rows only . Consiglierei di usarlo al posto della soluzione sopra. Grazie a Lalit Kumar B per averlo segnalato.

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

Ma cosa succede se ci sono due (o più) reparti con lo stesso numero? Non preoccuparti, esiste una variante che restituisce tutte le cravatte:

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