Order-By

子查詢中 ORDER BY 的數據庫實現

  • October 12, 2018

我正在使用一個包裝 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最外面的查詢上。無論您使用什麼平台,這都應該是您堅持的原則。

您要求提供一個正式聲明不支持某些內容的連結。這就像在您的車主手冊中查找您的汽車不能飛行的官方聲明一樣。

引用自:https://dba.stackexchange.com/questions/82930