2013-04-29 68 views
3

我對SQL執行順序沒有深入的瞭解。外部查詢OrderBy不取決於內部查詢的結果集

當我執行查詢

select top 2 * from Configuration 

它給了我

ABC1,100,Data001  
ABC2,200,Data002 

當我執行查詢

select top 2 * from Configuration order by 1 desc 

它給了我

XYZ1,400,Data100  
XYZ2,300,Data099 

當我執行查詢

select * from (select top 2 * from Configuration) as a order by 1 desc 

它給了我

XYZ1,400,Data100  
XYZ2,300,Data099 

我的問題是爲什麼我收到

XYZ1,400,Data100  
XYZ2,300,Data099 

作爲代替輸出

ABC1,100,Data001  
ABC2,200,Data002 

根據我的知識,內部查詢將返回兩行到外部查詢。 外查詢將處理這些兩排,

From->Where->group by->having->Select->Order by 

序執行的,並給輸出作爲我提到如預期兩行。但Outer Query的順序影響着Inner Query的整個表格。

請評論我在哪裏犯錯。

+0

你使用哪種DBMS?我正在使用SQL Server,結果如預期的那樣,ABC2,200,Data002由ABC1,100,Data001跟隨。 – Mithrandir 2013-04-29 07:00:51

+0

@Mithrandir - 沒有。我沒有在SQL Server中獲得預期的結果。 – hims056 2013-04-29 07:02:36

+0

我正在使用SQL Server 2008. – Romesh 2013-04-29 07:11:45

回答

4

SQL Server沒有任何意義默認順序填充。 在你的內部查詢中你沒有指定順序,所以它返回了錯誤的結果。 現在使用下面的代碼爲SQL Server 2008 R2

SELECT * FROM (SELECT TOP 2 * FROM Configuration ORDER BY 1) AS a ORDER BY 1 DESC 

一個另一種方法是:Comman表表達式,如下面,

;WITH cteTest AS 
(
    SELECT TOP 2 * 
    FROM Configuration ORDER BY 1 
) 
SELECT * FROM cteTest ORDER BY 1 DESC 
+0

謝謝你的答覆。 但我不會將它標記爲Accepted,因爲我想要SQL以這種方式操縱執行的原因。 而且你也提到「SQL Server沒有任何意義可以通過默認順序填充」, 它有默認的升序「order by」。 例如。 選擇top 2 T.*從( 選擇「DATA5」作爲C1 工會 選擇「數據3」 工會 選擇「數據4」 工會 選擇「數據2」 工會 選擇「數據1」 工會 選擇「DATA6」)筆 它會給 C1 ----- 數據1 數據2 – Romesh 2013-04-29 10:49:05

+0

ROM,SQL將處理良好的性能路徑查詢的基礎上,我同意你的看法,在默認情況ORDER BY子句上升,但SQL將決定其上它列應該適用。 SQL Server多次在不同的環境下返回不同的結果,它會自動檢查執行的好路徑,所以如果你想按升序選擇前兩個數據庫,那麼你必須指定 ,否則它將基於良好的執行路徑。答案被接受了嗎? – Anvesh 2013-04-29 11:01:48