2014-09-24 100 views
0

記錄結果爲了我有這個疑問:差異對同一查詢

SELECT -- some columns -- 
FROM ABC 
    INNER JOIN DEF ON DEF._VALUE = SUBSTRING(ABC._VALUE, 1, 6) 
    INNER JOIN GHI ON GHI.CODE = DEF.CODE 
    LEFT OUTER JOIN DC ON DC.PAN = ABC.PAN 
    LEFT OUTER JOIN BR ON BR.NAME = DC.NAME 
WHERE ABC.RECEIVED_DATE >= CONVERT(DATETIME,'2014-01-01 00:00:00',120) 
     AND ABC.RECEIVED_DATE <= CONVERT(DATETIME,'2014-01-10 23:59:59',120) 
     AND ('-1' IN ('-1') OR ABC.ID IN ('-1')) 
     AND ('-1' IN ('2012') OR BR.NAME IN ('2012')) 
     AND ABC.PAN LIKE '%' + '%' + '%' 
     AND DC.RL LIKE '%' + '%' + '%' 
     AND (ABC.RC = '1') 

每次它擊中它得到的記錄相同數量(比如15),但記錄的順序數據庫時不同的是每時間。如果在第一次嘗試中顯示爲記錄#-1的記錄顯示在第二次嘗試中的記錄#-6可能是。換句話說,訂單受到干擾(每次訂單不一致)。

可能的原因是什麼?由於索引或什麼?我不確定這是爲什麼。引導我請

+0

確定..但是,當我只是想:SELECT * FROM ABC。它不會隨機給我記錄,只要我沒有明確地在這種情況下使用ORDER BY。 – Sadiq 2014-09-24 09:20:50

+2

閱讀此:如果你**需要**訂購 - 你**必須**指定一個'訂單BY' - 就這麼簡單。沒有'ORDER BY' ---> ** NO **(有保證)訂購 – 2014-09-24 09:21:49

回答

3

既然你沒有指定明確的ORDER BY條款,有沒有訂購(這是任何RDBMS的默認行爲)。

無論數據庫引擎如何,數據都以任何方式返回。這可能看起來訂購 - 但不能保證 - 下次運行查詢時(不含ORDER BY),您的結果返回可能會以不同的順序

如果您需要訂購 - 您必須指定ORDER BY條款!

見亞歷山大·庫茲涅佐夫這篇博客Without ORDER BY, there is no default sort order其中包含證明了這一事實一個不錯的簡單的攝製腳本 - 沒有ORDER BY ==沒有默認排序....

+1

請親自嘗試:[例1](http://gvee.co.uk/files/sql/Expecting%20order%20without%20ORDER% 20BY%20(1).sql),[示例2](http://gvee.co.uk/files/sql/Expecting%20order%20without%20ORDER%20BY%20(2).sql),[示例3 ](http://gvee.co.uk/files/sql/Expecting%20order%20without%20ORDER%20BY%20(3).sql) – gvee 2014-09-24 11:43:27

+0

@gvee:謝謝 - 但這應該證明什麼?你有沒有看過Alex Kuznetsov的樣本我鏈接到? – 2014-09-24 13:19:43

+1

嗨@mar​​c_s,是的,我之前見過Alex的例子。這些僅僅是爲什麼你不能在不指定'ORDER BY'的情況下預期訂單的小例子。附:評論不是針對你,而是針對未來的讀者。 – gvee 2014-09-24 13:53:29