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