Окт 142011
 

ROWNUM - псевдостолбец, содержащий номер записи, возвращаемой запросом.
Запросы, имеющие условие, содержащее ROWNUM, имеют 2 интересных особенности:

  1. ROWNUM вычисляется до выполнения сортировки

    Именно поэтому, если мы хотим ограничить отсортированный вывод, надо использовать вложенный запрос:

    -- Классика - top10
    SELECT * FROM
       (SELECT * FROM emp ORDER BY salary)
    WHERE ROWNUM < 11;
  2. Выражение, проверяющее, что ROWNUM больше некоего числа, всегда ложно

    Этот запрос никогда не вернёт строк. Никогда.

    SELECT * FROM emp
        WHERE ROWNUM > 10;

    Вот как это работает:
    Первая строка имеет ROWNUM = 1 и под условие не подходит.
    Выбирается вторая строка. Она теперь тоже имеет ROWNUM = 1 в результирующей выборке, но тоже не подходит под условие, etc.
    Кстати, та же история с IN и BETWEEN.

Про эти особеннсти стоит помнить, чтобы не наткнуться на совершенно неожиданное поведение запроса в пятницу вечером.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)