Почему = оператор не работает с ROWNUM кроме значения 1? - PullRequest
8 голосов
/ 13 марта 2012

У меня следующий запрос:

select * from abc where rownum = 10

Вывод : нет записей для отображения

У меня наверняка есть более 25 записей в таблице abc, и моя цель - показать n-ую запись.

Если я напишу запрос как: -

select * from abc where rownum = 1

работает нормально и дает мне первую запись. Никакой другой записи, кроме первой.

Есть идеи?

1 Ответ

19 голосов
/ 13 марта 2012

Поскольку номера строк присваиваются последовательно выбранным строкам и .

Вот как работает ваш оператор.Он захватывает первую строку-кандидат и временно присваивает ей строку № 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 «истинному» столбцу с последующим использованием этого реального номера столбца для фильтрации результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...