Es funktioniert nicht, weil:für die erste Zeile ROWNUM
ist 1
und in diesem Fall MOD(ROWNUM,2)
ist 1
und seit Ihrem WHERE
Anweisung ist MOD(ROWNUM,2)=0
dann reduziert sich dies auf 1=0
und die Zeile wird verworfen. Die nachfolgende Zeile wird dann gegen eine ROWNUM
getestet von 1 (da die vorherige Zeile nicht mehr in der Ausgabe enthalten ist und keine Zeilennummer hat), wodurch der Test erneut fehlschlägt und verworfen wird. Wiederholen, bis zum Erbrechen und alle Zeilen scheitern an WHERE
testen und werden verworfen.
Wenn Sie versuchen, die ungeraden Zeilen auf diese Weise mit WHERE MOD(ROWNUM,2)=1
zu erhalten dann wird nur die erste Zeile zurückgegeben und die zweite und alle weiteren Zeilen bestehen den Test nicht und werden nie in die Abfrage aufgenommen.
Wie Vijaykumar Hadalgi vorschlägt, müssen Sie die ROWNUM in einer Unterabfrage auswählen (wo sie alle Zeilen ohne eine where-Klausel nummerieren kann, um sie einzuschränken) und dann in der äußeren Abfrage den Test durchführen, um die Zeilen einzuschränken:
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