Oracle / SQL: почему запрос «SELECT * FROM records WHERE rownum> = 5 AND rownum <= 10» - возвращает ноль строк - PullRequest
10 голосов
/ 13 мая 2009

Почему следующий запрос возвращает ноль записей:

SELECT * FROM records WHERE rownum >= 5 AND rownum <= 10

     OR

SELECT * FROM records WHERE rownum >= 5 

Принимая во внимание, что следующий запрос возвращает правильные записи:

SELECT * FROM records WHERE rownum <= 15

С уважением,
- Ашиш

Ответы [ 3 ]

32 голосов
/ 13 мая 2009

В Oracle значения Rownum назначаются после этапа фильтрации запроса - они не являются строками таблицы, а являются строками набора результатов запроса.

Таким образом, первая строка, которая возвращается, всегда будет иметь значение rownum 1, вторая строка, которая возвращается rownum 2 и т. Д.

Значение rownum увеличивается только после того, как оно назначено, поэтому любой запрос, такой как

select * from t where ROWNUM > 1

будет никогда не даст никаких результатов. Этот запрос говорит: «Я не хочу видеть первую строку, которая мне возвращается, только те, что после», что является своего рода парадоксом, поэтому ничего не возвращается.

См. Спросите Тома: о ROWNUM и ограничении результатов для более подробной информации.

1 голос
/ 30 июня 2016

Альтернативой является использование MINUS

SELECT * FROM records 
WHERE   ROWNUM <= 10
minus SELECT * FROM records 
WHERE   ROWNUM <= 5

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

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

1 голос
/ 24 июня 2014

ROWNUM - псевдостолбец, и его значение не будет доступно во время выполнения запроса. Таким образом, вы не можете фильтровать свои результаты на основе этого столбца. С учетом сказанного, есть обходные пути, чтобы смягчить его. Пожалуйста, смотрите ниже (не рекомендуется использовать, если ваш результат очень велик).

Select a.* From 
(
  Select COL1, COL2, ROWNUM RowNumber From MyTable
) a
Where
   RowNumber = 5;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...