Oracle gán các giá trị cho ROWNUM tuần tự khi các hàng được tạo ra bởi truy vấn - do đó, hàng đầu tiên được tìm nạp nhận ROWNUM =1, hàng thứ hai được tải xuống nhận ROWNUM =2, hàng thứ ba được tải xuống nhận ROWNUM =3, v.v. Lưu ý - cho một hàng được gán ROWNUM =3 PHẢI tìm nạp hai hàng trước đó. Và đây là lý do tại sao truy vấn của bạn không trả về hàng nào. Bạn đang yêu cầu cơ sở dữ liệu cho hàng thứ ba được tìm nạp - nhưng hàng 1 và 2 chưa bao giờ được tìm nạp.
Để chứng minh, hãy thử chạy các truy vấn sau:
SELECT S.* FROM SALARY S; -- Should return all rows
SELECT ROWNUM, S.* FROM SALARY S; -- Should return all rows with ROWNUM prepended
SELECT ROWNUM, S.* FROM SALARY WHERE ROWNUM=3; -- Should return no rows
Để khắc phục sự cố của bạn, hãy thử cách sau:
SELECT ROW_NUMBER FROM
(SELECT ROWNUM AS ROW_NUMBER, S.* FROM SALARY S)
WHERE ROW_NUMBER = 3;
Chia sẻ và tận hưởng.