Почему вы думаете, что это замедлит его? 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
.
ли вы когда-нибудь спите? Я решил, что у меня будет шанс ответить на некоторые вопросы SQL поздно вечером, но NOOOOO. ;) –
Кроме того: 1) rownum без предложения ORDER BY не имеет смысла. 2) Правильность сначала, производительность вторая! – LoztInSpace
Зависит от намерений автора. Это бессмысленно без ORDER BY, если целью является получение определенных строк. Но если намерение состоит только в том, чтобы маркировать возвращаемые строки, то это другое. Представленный вопрос не указывает намерения. Это решение просто маркирует строки, и в этом случае не требуется подзапрос. Добавьте ORDER BY во внутренний запрос, и значение изменится, и это будет иметь больше смысла. – Glenn