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

это отфильтрует не уникальные значения, поэтому лучше выбрать идентификатор.

Надеюсь, это сэкономит вам некоторое время.