проблема с rownum - PullRequest
       1

проблема с rownum

0 голосов
/ 22 июня 2011

У меня есть запрос

select * from tablename where rownum =1;

Этот запрос дает желаемый результат, но если я запускаю

select * from tablename where rownum=2;

, то этот запрос дает нулевой результат.Есть идеи почему?

Ответы [ 2 ]

5 голосов
/ 22 июня 2011

Предикат WHERE rownum=2 никогда не может быть истинным из-за способа назначения ROWNUM. Например, если в таблице 5 строк, алгоритм будет выглядеть примерно так:

  • Получить первый ряд из таблицы. Присвойте ему значение 1.
  • Сверьте этот rownum с предикатом, отбросьте
  • Получить второй ряд из таблицы. Присвойте ему значение 1.
  • Сверьте этот rownum с предикатом, отбросьте
  • Получить третий ряд из таблицы. Присвойте ему значение 1.
  • Проверьте этот rownum против предиката, отбросьте
  • Получить четвертый ряд из таблицы. Присвойте ему значение 1.
  • Проверьте этот rownum против предиката, отбросьте
  • Получить пятый ряд из таблицы. Присвойте ему значение 1.
  • Сверьте этот rownum с предикатом, отбросьте

Поскольку в наборе результатов нет «первой строки», «второй строки» быть не может. Вы можете использовать ROWNUM в сравнениях неравенства, т.е.

SELECT *
  FROM table_name
 WHERE rownum <= 2

вернет 2 строки.

Если вы пытаетесь определить «вторую строку» в таблице, вам, скорее всего, понадобится что-то вроде

SELECT *
  FROM (SELECT t.*,
               rank() over (order by some_column) rnk
          FROM table_name)
 WHERE rnk = 2
1 голос
/ 22 июня 2011

Я не думаю, что это четко определенный запрос:

ROWNUM - это псевдостолбец, который возвращает позицию строки в наборе результатов.ROWNUM оценивается ПОСЛЕ того, как записи выбраны из базы данных и ДО выполнения предложения ORDER BY.

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