To nie działa, ponieważ:dla pierwszego wiersza ROWNUM
to 1
i w tym przypadku MOD(ROWNUM,2)
to 1
i ponieważ twój WHERE
instrukcja to MOD(ROWNUM,2)=0
to zmniejsza się do 1=0
a rząd jest odrzucany. Kolejny wiersz zostanie następnie przetestowany pod kątem ROWNUM
z 1 (ponieważ poprzedni wiersz nie jest już wyświetlany i nie będzie miał numeru wiersza), który ponownie nie przejdzie testu i zostanie odrzucony. Powtarzam, do znudzenia i wszystkie wiersze kończą się niepowodzeniem WHERE
test i są odrzucane.
Jeśli spróbujesz uzyskać nieparzyste wiersze w ten sposób, używając WHERE MOD(ROWNUM,2)=1
wtedy zwróci tylko pierwszy wiersz, a drugi i kolejne wiersze nie przejdą testu i nigdy nie zostaną uwzględnione w zapytaniu.
Jak sugeruje Vijaykumar Hadalgi, musisz wybrać ROWNUM w podzapytaniu (gdzie może ponumerować wszystkie wiersze bez klauzuli WHERE, aby ją ograniczyć), a następnie w zapytaniu zewnętrznym wykonać test, aby ograniczyć wiersze:
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