Поскольку номера строк присваиваются последовательно выбранным строкам и .
Вот как работает ваш оператор.Он захватывает первую строку-кандидат и временно присваивает ей строку № 1, которая не соответствует вашему условию, поэтому она отбрасывается.
Затем вы получаете вторую строку-кандидат, и это также с данной строкойномер 1 (так как предыдущий был отброшен).Это тоже не соответствует.
Тогда третий кандидатский ряд ... ну, я уверен, вы можете видеть, куда это идет сейчас.Короче говоря, вы никогда не найдете строку, которая удовлетворяет этому условию.
Номера строк полезны только для = 1
, < something
или <= something
.
Все это объясняется в Документы Oracle для псевдостолбца rownum
.
Следует также помнить, что SQL - это реляционная алгебра, которая возвращает неупорядоченные множества, если вы не укажете порядок.Это означает, что строка номер десять может быть чем-то другим сейчас, а что-то другим - через три минуты.
Если вы хотите (по общему признанию) способ получить n
-й ряд, вы можете использовать что-то вроде (для пятогострока):
select * from (
select * from (
select col1, col2, col3 from tbl order by col1 asc
) where rownum < 6 order by col1 desc
) where rownum = 1
Внутренний выбор гарантирует, что у вас будет согласованный порядок в запросе, прежде чем вы начнете выбрасывать строки, а средний выбор выберет все, кроме первых пяти строк, а такжеобратный порядок.
Внешний выбор тогда вернет только первый ряд обратного набора (который является последним рядом пятистрочного набора, когда он был в порядке возрастания).
Вероятно, лучший способ:
select * from (
select rownum rn, col1, col2, col3 from tbl order by col1
) where rn = 5
Это работает путем извлечения всего и присвоения rownum «истинному» столбцу с последующим использованием этого реального номера столбца для фильтрации результатов.