Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Câu lệnh Rownum trả về hàng khác với hàng không có nó

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lọc các hàng chỉ có dữ liệu số trong SQL cột

  2. Truy vấn SQL để trả về một hàng ngay cả khi không tìm thấy, với ít nhất là trong các tham số

  3. Phiên Oracle không thể thực hiện được đang chờ trên SQL * Thông báo mạng từ sự kiện máy khách

  4. Lỗi (5,3):PLS-00103:Gặp phải biểu tượng BEGIN khi mong đợi một trong những điều sau:ngôn ngữ

  5. Lưu trữ Mảng có thể tìm kiếm trong trường cơ sở dữ liệu SQL