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

Bí ẩn của rownum trong tiên tri

ROWNUM kỳ lạ ở chỗ nó có thể được đánh giá là một phần của điều kiện trong truy vấn - nhưng nếu sau đó hàng không vượt qua được bộ lọc đó thì ROWNUM giá trị mà nó đã được gán sẽ có sẵn để được sử dụng lại cho hàng tiếp theo.

Một tác dụng quan trọng của việc này là nếu bạn sử dụng bất kỳ điều kiện nào loại trừ ROWNUM giá trị 1, bạn sẽ không bao giờ nhận được một kết quả phù hợp. Hàng đầu tiên được kiểm tra theo điều kiện này sẽ là hàng 1; nhưng sau đó nó sẽ trượt thử nghiệm, vì vậy hàng tiếp theo sau đó sẽ được coi là hàng 1; và như vậy.

Vì vậy, điều kiện của bạn ROWNUM BETWEEN 2 AND 4 không bao giờ có thể đúng.

Cách giải quyết bạn đã tìm thấy là giải pháp truyền thống. Cách khác sẽ là sử dụng một hàm phân tích để xếp hạng các hàng, sau đó lọc theo thứ hạng, ví dụ:

SELECT MI.* FROM (
  SELECT USER_ID,CUSTOMER_NAME, RANK() OVER (ORDER BY CREATION_DATE DESC) AS the_rank
  FROM ELEC_AUTO_MERC 
  ) MI
WHERE the_rank BETWEEN 2 AND 4;

Một số hàm phân tích - RANK, DENSE_RANK và ROW_NUMBER - có thể được sử dụng cho mục đích này và sẽ tạo ra các kết quả hơi khác nhau, đặc biệt nếu có ràng buộc. Xem tài liệu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Việc chọn cả MIN và MAX từ Bảng chậm hơn dự kiến

  2. ngày sql oracle không muộn hơn hôm nay

  3. Tạo chuỗi với BẮT ĐẦU VỚI từ Truy vấn

  4. Tại sao truy vấn SELECT không bắt đầu giao dịch? [Oracle]

  5. SQLcl để chuyển dữ liệu từ Oracle sang PostgreSQL hoặc YugabyteDB 🅾🐘🚀