No funciona porque:para la primera fila ROWNUM
es 1
y, en este caso, MOD(ROWNUM,2)
es 1
y desde tu WHERE
declaración es MOD(ROWNUM,2)=0
entonces esto se reduce a 1=0
y la fila se descarta. La fila subsiguiente luego se probará contra un ROWNUM
de 1 (dado que la fila anterior ya no está en la salida y no tendrá un número de fila), que nuevamente fallará la prueba y será descartada. Repita, ad nauseum y todas las filas fallan en WHERE
se prueban y se descartan.
Si intenta obtener las filas impares de esta manera usando WHERE MOD(ROWNUM,2)=1
luego devolverá solo la primera fila y la segunda fila y las siguientes no pasarán la prueba y nunca se incluirán en la consulta.
Como sugiere Vijaykumar Hadalgi, debe seleccionar ROWNUM en una subconsulta (donde puede numerar todas las filas sin una cláusula where para restringirlo) y luego en la consulta externa realizar la prueba para restringir las filas:
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.
SQLFIDLE