Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

A instrução Rownum retorna uma linha diferente da sem ela


Seu problema é causado pelo fato de que o where cláusula é aplicada antes de order by .

Você pode contornar o problema classificando primeiro e depois aplicando 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;

Observação:

Esse problema é específico do Oracle. MS SQL Server TOP e MySQL LIMIT ambos são aplicados após o order by cláusula.

Observação 2:

No Oracle Database 12c ( 12.1), há um novo recurso para selecionar as linhas k a k+m , offset k rows fetch next m rows only . Eu recomendaria usá-lo em vez da solução acima. Obrigado a Lalit Kumar B por apontar isso.
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

Mas e se houver dois (ou mais) departamentos com o mesmo número? Não se preocupe, existe uma variante que retorna todos os empates:
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