Nó không hoạt động vì:đối với hàng đầu tiên ROWNUM
là 1
và trong trường hợp này, MOD(ROWNUM,2)
là 1
và kể từ WHERE
của bạn câu lệnh là MOD(ROWNUM,2)=0
sau đó điều này giảm xuống 1=0
và hàng bị loại bỏ. Sau đó, hàng tiếp theo sẽ được kiểm tra với ROWNUM
của 1 (vì hàng trước đó không còn trong đầu ra và sẽ không có số hàng), hàng này sẽ lại không đạt thử nghiệm và bị loại bỏ. Lặp lại, bảo tàng quảng cáo và tất cả các hàng đều lỗi WHERE
thử nghiệm và bị loại bỏ.
Nếu bạn cố gắng lấy các hàng lẻ theo cách này bằng cách sử dụng WHERE MOD(ROWNUM,2)=1
thì nó sẽ chỉ trả về hàng đầu tiên và hàng thứ hai, và các hàng tiếp theo sẽ không đạt yêu cầu kiểm tra và sẽ không bao giờ được đưa vào truy vấn.
Như Vijaykumar Hadalgi đề xuất, bạn cần chọn ROWNUM trong một truy vấn phụ (nơi nó có thể đánh số tất cả các hàng mà không có mệnh đề where để hạn chế nó) và sau đó trong truy vấn bên ngoài, hãy thực hiện kiểm tra để hạn chế các hàng:
SELECT ename, job
FROM (
SELECT ename,
job,
ROWNUM AS row_id -- Generate ROWNUM second.
FROM (
SELECT ename, job
FROM Emp
ORDER BY ename -- ORDER BY first.
)
)
WHERE MOD( row_id, 2 ) = 0; -- Filter third.
SQLFIDDLE