2013-06-22 3 views
0

Я haae эту причуду с ROWNUM:Проблемы с ROWNUM в запросе

select rownum as n, s.* from vzwnet.site_inst s where n between 2 and 10 --> dones not work 

я должен поставить его как:

select * from (select rownum n, t.* from table t) where n between 2 and 10 

Это будет замедлять его много. Почему это?

ответ

10

Почему вы думаете, что это замедлит его? Oracle не обязательно создает подзапросы.

Существует две причины, по которым вам приходится писать его с помощью подзапроса. Во-первых, вы не можете использовать переменные, определенные в предложении select в предложении from. Для этого вам нужен подзапрос.

Во-вторых, вы не можете сказать where rownum between 2 and 10. Значение rownum устанавливается, когда данные возвращаются из select. Если первая строка не возвращена, вторая никогда не появляется.

Если вы беспокоитесь о производительности, вы можете сделать это:

select * 
from (select rownum n, t.* 
     from table t 
     where rownum <= 10 
    ) 
where n between 2 and 10 

EDIT:

Использование rownum без order by возвращает произвольный набор строк, которые могут варьироваться от одного исполнения к другому , Он не возвращает «случайный» набор (что намного сложнее сделать). Может показаться, что первые строки вставлены в таблицу, но это не гарантировано.

Я оставляю решение в этой форме, потому что вопрос был о «возвращении строк», а не о том, какие строки возвращаются. Однако без order by это эквивалентно (как говорит Роб в комментарии) до rownum <= 9.

+2

ли вы когда-нибудь спите? Я решил, что у меня будет шанс ответить на некоторые вопросы SQL поздно вечером, но NOOOOO. ;) –

+6

Кроме того: 1) rownum без предложения ORDER BY не имеет смысла. 2) Правильность сначала, производительность вторая! – LoztInSpace

+0

Зависит от намерений автора. Это бессмысленно без ORDER BY, если целью является получение определенных строк. Но если намерение состоит только в том, чтобы маркировать возвращаемые строки, то это другое. Представленный вопрос не указывает намерения. Это решение просто маркирует строки, и в этом случае не требуется подзапрос. Добавьте ORDER BY во внутренний запрос, и значение изменится, и это будет иметь больше смысла. – Glenn

1

Если вы просто хотите нумеровать свои записи от 2 до 10, нет необходимости подзапроса:

SELECT rownum + 1 AS n, s.* 
    FROM vzwnet.site_inst s 
    WHERE rownum < 10 
Смежные вопросы