Twój problem jest spowodowany faktem, że where klauzula jest stosowana przed order by .
Możesz obejść problem, najpierw sortując, a następnie stosując 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;
Uwaga:
Ten problem jest specyficzny dla Oracle. MS SQL Server TOP i MySQL LIMIT oba są stosowane po order by klauzula.
Uwaga 2:
W Oracle Database 12c ( 12.1), dostępna jest nowa funkcja wybierania wierszy od k do k+m
, offset k rows fetch next m rows only . Sugerowałbym użycie go zamiast powyższego rozwiązania. Dziękuję Lalit Kumar B za wskazanie tego.
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
Ale co, jeśli są dwa (lub więcej) działy o tym samym numerze? Nie martw się, istnieje wariant, który zwraca wszystkie remisy:
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