Предикат WHERE rownum=2
никогда не может быть истинным из-за способа назначения ROWNUM. Например, если в таблице 5 строк, алгоритм будет выглядеть примерно так:
- Получить первый ряд из таблицы. Присвойте ему значение 1.
- Сверьте этот rownum с предикатом, отбросьте
- Получить второй ряд из таблицы. Присвойте ему значение 1.
- Сверьте этот rownum с предикатом, отбросьте
- Получить третий ряд из таблицы. Присвойте ему значение 1.
- Проверьте этот rownum против предиката, отбросьте
- Получить четвертый ряд из таблицы. Присвойте ему значение 1.
- Проверьте этот rownum против предиката, отбросьте
- Получить пятый ряд из таблицы. Присвойте ему значение 1.
- Сверьте этот rownum с предикатом, отбросьте
Поскольку в наборе результатов нет «первой строки», «второй строки» быть не может. Вы можете использовать ROWNUM в сравнениях неравенства, т.е.
SELECT *
FROM table_name
WHERE rownum <= 2
вернет 2 строки.
Если вы пытаетесь определить «вторую строку» в таблице, вам, скорее всего, понадобится что-то вроде
SELECT *
FROM (SELECT t.*,
rank() over (order by some_column) rnk
FROM table_name)
WHERE rnk = 2