2013-03-06 42 views
0

這裏是我的問題,有人問我,以確保大項目中報表時都裹得像個:SQL SELECT語句是否穩定?

Select * from (Select ... order by column) 

保持自己的排序。這引出了一個問題,是否有一些官方的源代碼定義了SQL選擇結果保持其排序?

要設置此方案爲grabbable但最小的範圍內:

想象一下,你有一個表名exampleTBL用A和B列執行SQL語句:

Select * from (Select B from exampleTBL order by A); 

會的結果,使用DBMS/Driver/Platform/...的獨立訂單由A?

+0

不,如果您未提供ORDER BY(在最外面的查詢上),則無法保證訂單。否則,優化器將決定您的訂單。 – 2013-03-06 11:06:32

+0

@TimSchmelter你有這方面的官方消息嗎?並不是說我不相信你的陳述,但我真的很喜歡一個消息來源。 – 2013-03-06 11:08:47

+0

我現在沒有時間去搜索,它依賴於rdbms無論如何(儘管我認爲至少Oracle和MS SQL-Server一起)。 – 2013-03-06 11:12:07

回答

1

SQL-2003 Standard(71WD2-02基金會-2011-12):


4.15.3派生表

派生表是一個表,直接或間接從一種或衍生通過評估 表達式(例如<joined table>,<data change delta table>,<query expression><table expression>)的更多其他表。 A <query expression>可以包含一個可選項。 指定的 表中的行的排序僅保證<query expression>立即包含<order by clause>


因此,DBMS沒有義務在子查詢中維護訂單。在你的例子中使用:

Select B from (Select B, A from exampleTBL) t order by A; 

無論您的數據庫管理系統是否維護訂單,我都會推薦這種方法。

1

不。不是每個數據庫都支持子查詢中的排序,因此您應該在外部查詢中定義順序(或者更好,但只是擺脫外部查詢)。同樣,如果你想確保你會得到相同的結果,你應該包括你在順序中選擇的每一列。最後,如果指數被使用或不使用,則外部排序不會改變。

+1

我不同意聲明*如果你想確保你會得到相同的結果,你應該包括你選擇的順序*中的每一列。如果從單個表中選擇並通過主鍵進行排序,則順序將始終相同,而不使用所有字段。這並不是說爲了保持一致的結果所需的列數儘可能多,而是沒有必要按所有列排序。 – GarethD 2013-03-06 11:40:56

+0

你說得對。它應該更像_在ORDER BY中包含一列或一組列以確保它們在result_中是唯一的,但我不確定如何編寫它以易於理解。 – 2013-03-06 11:56:13

+0

@JakubKania這是候選鍵的定義。 – 2013-09-09 18:03:44