子查詢中 ORDER BY 的數據庫實現
我正在使用一個包裝 SQL 語句的應用程序(MapServer - http://mapserver.org/),因此 ORDER BY 語句位於內部查詢中。例如
SELECT * FROM ( SELECT ID, GEOM, Name FROM t ORDER BY Name ) as tbl
該應用程序有許多不同的數據庫驅動程序。我主要使用 MS SQL Server 驅動程序和 SQL Server 2008。如果在子查詢中找到 ORDER BY,則會引發錯誤。
從 MS Docs (雖然這似乎仍然適用於 SQL Server 2000):
當您在視圖、內聯函式、派生表或子查詢中使用 ORDER BY 子句時,它不保證有序輸出。相反,ORDER BY 子句僅用於保證由 Top 運算符生成的結果集具有一致的構成。ORDER BY 子句僅在最外層的 SELECT 語句中指定時才保證有序的結果集。
但是,在 Postgres (9) 和 Oracle 中執行時,相同類型的查詢會返回結果 - 其順序與子查詢中定義的順序相同。在 Postgres 中,查詢計劃顯示結果已排序,並且 Postgres 發行說明包括暗示使用子查詢訂單的項目:
子查詢 ORDER BY 匹配上層查詢時避免排序
http://en.wikipedia.org/wiki/Order_by狀態:
儘管某些數據庫系統允許在子選擇或視圖定義中指定 ORDER BY 子句,但其存在沒有任何影響。
但是,根據我自己對查詢計劃的檢查:
- SQL Server 2008 不支持子查詢中的 ORDER BY
- Postgres 9 在子查詢中支持 ORDER BY
- Oracle 10g 在子查詢中支持 ORDER BY
所以我的問題是有任何連結可以正式確認或否認 Postgres 和 Oracle 不允許在子查詢中排序?
您將不得不讓您的應用程序不將其
ORDER BY
放在子查詢中(也許它首先可以選擇不使用不必要的子查詢)。正如您已經發現的那樣,沒有TOP
. 並且TOP
,除非您想省略一些行,否則 using無論如何TOP 100 PERCENT
都會渲染優化。ORDER BY
而在 Oracle 和 PostGres 中,僅僅因為語法被支持,並不意味著它被遵守。並且僅僅因為您觀察到它在某些情況下被遵守,並不意味著隨著新版本的出現或您的數據、統計資訊、查詢本身或環境發生細微的變化,它將繼續被遵守。
我可以向您保證,毫無疑問,如果您想要保證訂單,您需要將 放在
ORDER BY
最外面的查詢上。無論您使用什麼平台,這都應該是您堅持的原則。您要求提供一個正式聲明不支持某些內容的連結。這就像在您的車主手冊中查找您的汽車不能飛行的官方聲明一樣。