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.