Не работи, защото:за първия ред ROWNUM
е 1
и в този случай MOD(ROWNUM,2)
е 1
и тъй като вашият WHERE
изразът е MOD(ROWNUM,2)=0
след това това намалява до 1=0
и редът се отхвърля. След това следващият ред ще бъде тестван срещу ROWNUM
от 1 (тъй като предишният ред вече не е в изхода и няма да има номер на ред), което отново ще се провали на теста и ще бъде отхвърлено. Повторете, гадене на рекламата и всички редове не отговарят на WHERE
тестват и се изхвърлят.
Ако се опитате да получите нечетните редове по този начин, като използвате WHERE MOD(ROWNUM,2)=1
след това ще върне само първия ред, а вторият и следващите редове ще се провалят при теста и никога няма да бъдат включени в заявката.
Както Виджайкумар Хадалги предлага, трябва да изберете ROWNUM в подзаявка (където може да номерира всички редове без клауза where, за да го ограничи) и след това във външната заявка да извършите теста, за да ограничите редовете:
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