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