Sự cố của bạn là do where
mệnh đề được áp dụng trước order by
.
Bạn có thể khắc phục sự cố bằng cách sắp xếp trước rồi áp dụng 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;
Lưu ý:
Vấn đề này là đặc thù của Oracle. MS SQL Server TOP
và MySQL LIMIT
cả hai đều được áp dụng sau order by
mệnh đề.
Lưu ý 2:
Trong Cơ sở dữ liệu Oracle 12c ( 12.1), có một tính năng mới để chọn hàng từ k đến k + m
, offset k rows fetch next m rows only
. Tôi muốn khuyên bạn nên sử dụng nó thay vì giải pháp trên. Cảm ơn Lalit Kumar B đã chỉ ra điều đó.
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
Nhưng nếu có hai (hoặc nhiều) bộ phận có cùng số lượng thì sao? Đừng lo lắng, có một biến thể trả về tất cả các mối quan hệ:
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