2015-04-21 34 views
2

如果沒有sortgroup by語句,我想知道PROC SQL返回數據的順序。它總是一樣嗎?PROC返回的行的順序SQL

例如,假設我這樣做:

proc sql; 
    create table cusips as 
     select a.cusip as c1, b.cusip as c2 
     from shrs a, shrs b; 
quit; 

這只是給了我兩個CUSIP變量的每個組合的列表。這些順序是否與原始輸入數據相同?它看起來像我的情況,但我想知道如果我能確定這將永遠是真實的。

+2

SQL中的表和結果集(不同於SAS)表示*無序*集。除非您指定'by by'子句,否則不能依賴結果集中值的排序。 –

回答

2

PROC SQL不保證在任何情況下的相同順序。 一般來說,如果你正在從一張表中做一個簡單的選擇,它可能會按照數據已經存在的順序返回,這主要是因爲沒有這樣做更多的工作。

然而,PROC SQL如果決定它是最佳的話,會做的事情一樣分割的數據分割成塊,並分別平行處理它們 - 並不像它應該可能,但它有時會不過。這經常發生在join,特別是因爲它可以做爲散列連接,在這種情況下,您可以按照一個表格的順序或兩者兼而有之,或笛卡爾產品或其他一些選項。

特別是,在上面的連接中,SQL優化器可能選擇將其作爲笛卡爾積,作爲散列連接,作爲索引連接或其他幾種方法。他們每個人都可能會導致不同的結果。即使在這種情況下,如果連接是由多個線程完成的,線程可能會根據當時執行的服務器/計算機的條件而有所不同(例如,如果一個CPU處於更多/更少的負載下來自其他進程,可能會獲得更少/更多的數據)。

因此,你永遠不應該依賴它將數據返回到順序 - 總是要求它按順序返回。

這也是爲什麼monotonic()函數不建議用於生產代碼的原因(因爲如果最終訂單不同於原始訂單,它可能不會始終返回預期值)。

如果您正在尋找以原始訂單取回數據並且不知道原始訂單或不想指定完整訂單,一個很好的解決方法是使用datastep視圖來獲取原始訂單。 Datastep視圖將按順序處理數據。

data myview/view=myview; 
    set mydata; 
    _ordervar+1; 
run; 

proc sql; 
    select * from myview 
    order by _ordervar; 
quit;