Oracle/SQL: почему запрос "SELECT * FROM records WHERE rownum >= 5 И rownum <= 10" - возвращает нулевые строки
Почему следующий запрос возвращает "нулевые" записи:
SELECT * FROM records WHERE rownum >= 5 AND rownum <= 10
OR
SELECT * FROM records WHERE rownum >= 5
В то время как следующий запрос возвращает правильные записи:
SELECT * FROM records WHERE rownum <= 15
С уважением,
- Ашиш
Ответы
Ответ 1
В Oracle значения Rownum назначаются после этапа фильтрации запроса - они не являются строками таблицы, они являются строками набора результатов запроса.
Итак, первая строка, которая возвращается, всегда будет дана rownum 1, вторая строка, возвращающаяся rownum 2 и т.д.
Значение rownum увеличивается только после его назначения, поэтому любой запрос, например
select * from t where ROWNUM > 1
будет никогда возвращать любые результаты. Этот запрос говорит: "Я не хочу видеть первую строку, которая возвращается мне, а только те, которые после нее", что является разновидностью парадокса, поэтому ничего не возвращается.
Подробнее см. Задать Tom: On ROWNUM и ограничить результаты.
Ответ 2
ROWNUM - это псевдоколонка, и это значение не будет доступно во время выполнения запроса. Таким образом, вы не можете фильтровать свои результаты на основе этого столбца. С учетом сказанного, есть проблемы, связанные с ее смягчением. См. Ниже (не рекомендуется использовать, если ваш результат очень большой).
Select a.* From
(
Select COL1, COL2, ROWNUM RowNumber From MyTable
) a
Where
RowNumber = 5;
Ответ 3
Альтернативой является использование MINUS
SELECT * FROM records
WHERE ROWNUM <= 10
minus SELECT * FROM records
WHERE ROWNUM <= 5
это отфильтрует не уникальные значения, поэтому лучше выбрать идентификатор.
Надеюсь, это сэкономит вам некоторое время.