Non funziona perché:per la prima riga ROWNUM
è 1
e, in questo caso, MOD(ROWNUM,2)
è 1
e poiché il tuo WHERE
l'istruzione è MOD(ROWNUM,2)=0
quindi questo si riduce a 1=0
e la riga viene scartata. La riga successiva verrà quindi testata rispetto a un ROWNUM
di 1 (poiché la riga precedente non è più nell'output e non avrà un numero di riga), che fallirà nuovamente il test e verrà scartato. Ripeti, fino alla nausea e tutte le righe non superano il WHERE
testare e vengono scartati.
Se provi a ottenere le righe dispari in questo modo utilizzando WHERE MOD(ROWNUM,2)=1
quindi restituirà solo la prima riga e la seconda e le righe successive non supereranno il test e non verranno mai incluse nella query.
Come suggerisce Vijaykumar Hadalgi, è necessario selezionare ROWNUM in una sottoquery (dove può numerare tutte le righe senza una clausola where per limitarla) e quindi nella query esterna eseguire il test per limitare le righe:
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