Order-By

SQL 視窗函式:結果是否有序?

  • February 1, 2019

如果我有一個使用類似的視窗函式

SELECT *, row_number() OVER (ORDER BY something) FROM table

應該訂購結果嗎?

我目前正在 Microsoft SQL Server 中測試我的查詢,它似乎是有序的,但我知道這個產品在沒有被詢問時傾向於對行進行排序。

這是標準行為嗎?

如果沒有表示 ORDER BY 子句,標準行為將返回一個沒有特定順序的集合。

我認為Itzik Ben-Gan解釋得最好,即使沒有他的一本書,你也可以在這篇文章中找到解釋。大約 12 段之後,在第一個程式碼範例旁邊,文本描述了視窗函式中的 ORDER BY 如何服務於描述集合的邏輯函式,以及它如何與表示 ORDER BY 子句完全分開。

此處出現一個相關問題 SELECT ROW_NUMBER() 是否保證返回按生成的行號排序的結果?

這取決於執行計劃。

在此處輸入圖像描述

此查詢掃描聚集索引,然後按有序列對結果進行排序以便能夠應用序列對象,然後將結果返回給客戶端。這就是為什麼您看到您的最終結果是有序的。

但是如果我們看一下第二個執行計劃(我強制合併​​連接只是為了顯示最終結果的可能性如何以另一個順序排列)

SELECT *
FROM dbo.ProjectAuditTrial
INNER MERGE JOIN (
SELECT *, row_number() OVER (ORDER BY MajorVersion) AS rownum FROM dbo.Project
) A ON A.ProjectID = ProjectAuditTrial.ProjectID

在此處輸入圖像描述

這個查詢我們的最終結果不是按視窗函式排序列排序的。

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