Masalah Anda disebabkan oleh fakta bahwa where
klausa diterapkan sebelum order by
.
Anda dapat mengatasi masalah dengan mengurutkan terlebih dahulu dan kemudian menerapkan 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;
Catatan:
Masalah ini khusus untuk Oracle. MS SQL Server TOP
dan MySQL LIMIT
keduanya diterapkan setelah order by
klausa.
Catatan 2:
Di Oracle Database 12c ( 12.1), ada fitur baru untuk memilih baris k sampai k+m
, offset k rows fetch next m rows only
. Saya akan merekomendasikan menggunakannya daripada solusi di atas. Terima kasih kepada Lalit Kumar B karena telah menunjukkannya.
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
Tetapi bagaimana jika ada dua (atau lebih) departemen dengan nomor yang sama? Jangan khawatir, ada varian yang mengembalikan semua ikatan:
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