Order-By
SQL 視窗函式:結果是否有序?
如果我有一個使用類似的視窗函式
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
這個查詢我們的最終結果不是按視窗函式排序列排序的。