[英]ORDER BY in a Sql Server 2008 view
我們的數據庫中有一個ORDER BY的視圖。 現在,我意識到觀點通常不會排序,因為不同的人可能會將它用於不同的事情,並希望它有所不同。 然而,該視圖用於需要特定訂單的非常特定的用例。 (這是足球聯賽的球隊排名。)
該數據庫是Windows Server 2003 R2上的Sql Server 2008 Express,v.10.0.1763.0。
視圖定義如下:
CREATE VIEW season.CurrentStandingsOrdered
AS
SELECT TOP 100 PERCENT *, season.GetRanking(TEAMID) RANKING
FROM season.CurrentStandings
ORDER BY
GENDER, TEAMYEAR, CODE, POINTS DESC,
FORFEITS, GOALS_AGAINST, GOALS_FOR DESC,
DIFFERENTIAL, RANKING
它返回:
GENDER, TEAMYEAR, CODE, TEAMID, CLUB, NAME,
WINS, LOSSES, TIES, GOALS_FOR, GOALS_AGAINST,
DIFFERENTIAL, POINTS, FORFEITS, RANKING
現在,當我對視圖運行SELECT時 ,它按GENDER,TEAMYEAR,CODE,TEAMID命令結果。 請注意,它是按TEAMID而不是POINTS排序,因為order by子句指定。
但是,如果我復制SQL語句並完全按照新查詢窗口中的方式運行它,它將按照ORDER BY子句的指定正確排序 。
SQL Server 2005在設計上忽略了TOP 100 PERCENT。
請嘗試使用TOP 2000000000。
現在,我會嘗試找一個參考資料......我參加了由Itzak Ben-Gan提出的研討會
發現一些......
在這種特殊情況下,優化器會識別TOP 100 PERCENT限定所有行,並且根本不需要計算。
從不保證具有ORDER BY
子句的視圖返回的行的順序。 如果需要特定的行順序,則必須指定從視圖中選擇的位置。
請參閱本書在線條目頂部的注釋。
只需使用:
“ 頂級(99)百分比 ”
要么
“Top(比你的數據行多了1000多倍,比如24682468123)”它有效! 就試一試吧。
在SQL Server 2008中,在使用TOP 100 PERCENT的視圖中忽略ORDER BY。 在SQL Server的早期版本中,只有在使用TOP 100 PERCENT時才允許ORDER BY,但從未保證完美的訂單。 然而,許多人認為完美的訂單是有保證的。 我推斷微軟不想誤導程序員和DBA相信使用這種技術有保證的訂單。
這里可以找到這種不准確性的優秀對比示例......
哎呀,我剛才注意到這已經回答了。 但無論如何,查看比較示范值得一看。
微軟解決了這個問題。 你有補丁你的SQL服務器
我找到了另一種解決方案。
我最初的計划是創建一個“sort_order”列,以防止用戶執行復雜的排序。
我使用了一個窗口函數ROW_NUMBER。 在ORDER BY子句中,我指定了我需要的默認排序順序(就像它在SELECT語句的ORDER BY中一樣)。
我得到了幾個積極的結果:
默認情況下,數據以我最初預期的默認排序順序返回(這可能是由於窗口函數必須在分配sort_order值之前對數據進行排序)
其他用戶可以選擇以其他方式對數據進行排序
sort_order列用於非常特定的排序需求,如果用戶使用重新排列行集的任何工具,用戶可以更輕松地對數據進行排序。
注意:在我的特定應用程序中,用戶通過Excel 2010訪問視圖,默認情況下,數據按照我的希望呈現給用戶,無需進一步排序。
希望這有助於那些有類似問題的人。
干杯,瑞恩
在數據庫上運行探查器跟蹤,並查看查詢視圖時實際運行的查詢。
您還可以考慮使用存儲過程從視圖中返回數據,並針對您的特定用例正確排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.