我有以下SQL SELECT語句: -Where條件和子查詢
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
當我將執行上面的語句,然後哪一個會先執行子查詢或主查詢?
請建議我
感謝
我有以下SQL SELECT語句: -Where條件和子查詢
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
當我將執行上面的語句,然後哪一個會先執行子查詢或主查詢?
請建議我
感謝
的query optimizer決定是執行查詢的最有效方式。它知道表中有多少行。我也建議到SQL Server企業管理器中的Include Actual Execution Plan
函數並檢查訂單。
你的子查詢將執行第一
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
你的問題是有點誤導。你假設需要執行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次單獨的傳遞,即將內部查詢物化爲臨時表,然後再執行臨時表的另一次掃描以執行過濾,請向您的供應商發送一封憤怒的電子郵件,或者只是獲取其他產品。 :)
'SELECT ROW_NUMBER()OVER(按Table1.ID排序) As RowNo,Table1.Name,Table1.Address' Executes First。爲什麼有這樣的疑問? –
每次子查詢執行第一次 – speeday125
@Arun P Johny爲什麼asp.net和c#標籤stille在那裏? –