Det fungerar inte eftersom:för den första raden ROWNUM
är 1
och, i det här fallet, MOD(ROWNUM,2)
är 1
och sedan din WHERE
satsen är MOD(ROWNUM,2)=0
sedan reduceras detta till 1=0
och raden kasseras. Den efterföljande raden kommer sedan att testas mot en ROWNUM
av 1 (eftersom den föregående raden inte längre finns i utgången och inte kommer att ha något radnummer), vilket igen kommer att misslyckas i testet och kasseras. Upprepa, ad nauseum och alla rader misslyckas med WHERE
testa och kasseras.
Om du försöker få de udda raderna på detta sätt med WHERE MOD(ROWNUM,2)=1
då returnerar den endast den första raden och den andra, och efterföljande, rader kommer att misslyckas i testet och kommer aldrig att inkluderas i frågan.
Som Vijaykumar Hadalgi föreslår, måste du välja ROWNUM i en underfråga (där den kan numrera alla rader utan en where-sats för att begränsa den) och sedan i den yttre frågan utföra testet för att begränsa raderna:
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