2013-08-21 6 views
0

Я следующий SQL SELECT заявление: -Где состояние и подзапрос

SELECT A.RowNo, A.Name, A.Address 
FROM (SELECT ROW_NUMBER() OVER(Order by Table1.ID) 
As RowNo, Table1.Name, Table1.Address From Table1) A 
WHERE RowNo Between 1 And 10 

Когда я исполнят выше заявление, то какой из них будет первым выполнить запрос к югу или основной запрос?

Пожалуйста, предложите мне

благодаря

+0

'SELECT ROW_NUMBER() OVER (Order by Table1.ID) As RowNo, Table1.Name, Table1.Address' Выполняет сначала. Почему такое сомнение? –

+0

каждый раз, когда Subquery выполняет сначала – speeday125

+0

@Arun P Johny, почему asp.net и C# теги stille там? –

ответ

0

query optimizer решает, является наиболее эффективным способом для выполнения запросов. Он знает, сколько строк находится в таблицах. Я также предлагаю использовать функцию Include Actual Execution Plan в SQL Server Enterprise Manager и проверять заказ.

0

Ваш суб-запрос будет выполнен первый

SELECT ROW_NUMBER() OVER(Order by Table1.ID) As RowNo, Table1.Name, Table1.Address From Table1 

Выше запроса является примером зрения инлайн, который имеет данные из Table1 с некоторыми дополнительными столбцами и этот вид можно назвать, как A.

Таким образом, вы окончательный запрос стать

SELECT A.RowNo, A.Name, A.Address FROM A WHERE RowNo Between 1 And 10 

где A имеет столбцы RowNo, Name, Address

0

Ваш вопрос несколько вводит в заблуждение. Вы предполагаете, что необходимо выполнить 2 запроса. В этом случае здравый смысл подскажет вам, что внутренние запросы должны выполняться перед внешними запросами.

Однако любой надежный оптимизатор запросов (вы не указали, какой продукт и версия вы используете) должны иметь возможность вывести, что это фактически единственный запрос, и это всего лишь глупое ограничение языка SQL, которое не позволяя вам написать:

SELECT ROW_NUMBER() OVER(Order by Table1.ID) As RowNo, Table1.Name, Table1.Address From Table1 WHERE RowNo Between 1 And 10 

Не стесняйтесь выразить свое разочарование ANSI (устанавливает стандарт SQL). Если на самом деле оптимизатор, который вы используете, должен выполнять 2 отдельных прохода, то есть материализовать внутренний запрос во временную таблицу, а затем выполнить другое сканирование таблицы temp для фильтрации, отправьте поставщику сердитый адрес электронной почты или просто получите другой продукт. :)

Смежные вопросы