2013-03-14 36 views
2

我知道工會刪除重複,但它改變了結果順序,即使沒有重複TSQL,工會變化導致秩序,工會都沒有

我有兩個選擇語句,通過聲明的任何地方

沒有秩序我想他們的工會有或沒有(全部)

即 「選擇聯盟(全部)選擇B」

「選擇B」實際上包含什麼,沒有條目將被退回

,如果我使用「選擇聯盟選擇B」,結果的順序是從只是不同的「選擇」

,如果我使用「選擇聯盟的所有選擇B」,結果的順序是一樣的「選擇A」本身

並且在「選擇A」中根本沒有重複。

這是爲什麼?它是不可預知的

回答

6

只有從SQL查詢中獲得特定結果順序的方法是使用ORDER BY子句。其他任何事情只是依賴巧合以及發出查詢時服務器的特定(暫時)狀態。

所以,如果你想/需要一個特定的訂單,使用ORDER BY


至於爲什麼它改變結果的排序 - 第一,UNION(不ALL)保證從結果中刪除所有重複的 - 不只是重複從不同的查詢產生的 - 所以,如果第一個查詢返回重複的行和第二個查詢返回沒有行,UNION仍然必須消除它們。

一個常見的,簡單的方法來確定你是否有重複的結果一袋是那些結果(無論排序順序是最方便的系統)進行排序 - 以這種方式,重複結束了彼此相鄰並所以你可以迭代這些排序結果和if(results[index] == results[index-1]) skip;

所以,你會經常發現一個UNION(不ALL)查詢的結果已經整理 - 在某些任意順序。但是,爲了重新強調原始點,應用什麼順序沒有定義,當然也不應該依賴 - 軟件的任何補丁,索引或統計信息的變化都可能導致系統在接下來選擇不同的排序順序執行查詢的時間 - 除非有ORDER BY條款。

+0

謝謝。我將不得不通過那裏訂購 – 2013-03-14 22:31:51

3

要理解SQL最重要的一點是,表沒有保證順序,因爲表應該表示一個集合(或多個集合,如果它有重複的),並且集合沒有順序。這意味着當您查詢表時未指定ORDER BY子句時,查詢返回表結果,並且SQL Server可以按任意順序返回輸出中的行。如果結果恰好是有序的,可能是由於優化原因。我試圖做的一點是,輸出中任何行的順序都被認爲是有效的,並且不保證特定的順序。確保結果中的行進行排序的唯一方法是顯式指定ORDER BY子句。

+0

謝謝。我必須在那裏下訂單 – 2013-03-14 22:31:31