Sql Server 2008 视图中的 ORDER BY
Posted
技术标签:
【中文标题】Sql Server 2008 视图中的 ORDER BY【英文标题】:ORDER BY in a Sql Server 2008 view 【发布时间】:2009-08-20 13:53:59 【问题描述】:我们的数据库中有一个视图,其中有一个 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 子句的指定正确排序。
【问题讨论】:
【参考方案1】:带有ORDER BY
子句的视图返回的行的顺序永远无法保证。如果您需要特定的行顺序,则必须指定从视图中选择的位置。
请参阅this Book On-Line 条目顶部的注释。
【讨论】:
这很烦人!我可以看到/理解不能在 VIEW 中保证它,有点......但它至少应该在表值函数中工作。 GRRR。无论如何感谢您的回答。 :)【参考方案2】:SQL Server 2005 在设计上忽略了 TOP 100 PERCENT。
改为尝试 TOP 2000000000。
现在,我将尝试寻找参考...我参加了由 Itzak Ben-Gan 举办的研讨会,他提到了它
找到一些...
Kimberly L. Tripp
"TOP 100 Percent ORDER BY Considered Harmful"
在这种特殊情况下,优化器 承认 TOP 100 PERCENT 限定所有行并且不需要 完全可以计算。
【讨论】:
我对偶然发现的这个 SQL Server 修补程序很好奇:support.microsoft.com/kb/926292:如果我没看错,那么修补程序会“修复”排序行为? @MitchWheat:是的,看起来很眼熟。我认为这意味着内部 TOP..ORDER BY fubars 外部 ORDER BY 我不确定是否如此。似乎说应用修补程序将保证视图中的 ORDER BY 始终有效(这显然与 MSDN 文章相矛盾(并且可能很合理!)) @MitchWheat:你说得对,我看错了。与提到 HF 的 sqlblog.com/blogs/tibor_karaszi/archive/2007/11/28/… 相关。洛萨cmets【参考方案3】:只需使用:
"前 (99) 个百分比 "
或
“顶部(比您的数据行多 1000 倍的数字,例如 24682468123)” 有用!试试看吧。
【讨论】:
【参考方案4】:在 SQL Server 2008 中,ORDER BY 在使用 TOP 100 PERCENT 的视图中被忽略。在 SQL Server 的早期版本中,仅在使用 TOP 100 PERCENT 时才允许使用 ORDER BY,但不能保证完美的顺序。然而,许多人认为可以保证完美的订单。我推断微软不想误导程序员和 DBA 相信使用这种技术可以保证顺序。
可以在此处找到对这种不准确性的出色比较演示...
http://blog.sqlauthority.com/2009/11/24/sql-server-interesting-observation-top-100-percent-and-order-by
糟糕,我刚刚注意到这已经被回答了。不过看看对比演示还是值得一看的。
【讨论】:
【参考方案5】:Microsoft 已解决此问题。你已经为你的 sql server 打了补丁
http://support.microsoft.com/kb/926292
【讨论】:
【参考方案6】:在您的数据库上运行探查器跟踪,并在您查询视图时查看实际上正在运行的查询。
您可能还想考虑使用存储过程从您的视图中返回数据,并针对您的特定用例正确排序。
【讨论】:
是的,我真的在寻找可以直接查询的东西……查看,表值函数,存储过程不是。【参考方案7】:我找到了另一种解决方案。
我最初的计划是创建一个“sort_order”列,以防止用户必须执行复杂的排序。
我使用了窗口函数 ROW_NUMBER。在 ORDER BY 子句中,我指定了我需要的默认排序顺序(就像在 SELECT 语句的 ORDER BY 中一样)。
我得到了几个积极的结果:
默认情况下,数据以我最初想要的默认排序顺序返回(这可能是由于窗口函数必须在分配 sort_order 值之前对数据进行排序)
其他用户可以选择以其他方式对数据进行排序
sort_order 列用于满足非常特定的排序需求,如果用户使用任何工具重新排列行集,用户可以更轻松地对数据进行排序。
注意:在我的特定应用程序中,用户通过 Excel 2010 访问视图,默认情况下,数据按我希望的方式呈现给用户,无需进一步排序。
希望这对有类似问题的人有所帮助。
干杯, 瑞恩
【讨论】:
以上是关于Sql Server 2008 视图中的 ORDER BY的主要内容,如果未能解决你的问题,请参考以下文章
了解 SQL Server 2008 R2 中索引视图中的列类型
sql server 2008怎么修改视图中的字段属性!!例如修改字段名和字段类型!
了解 SQL Server 2008 R2 中的索引视图更新和查询过程
SQL Server 2008 R2 和索引视图中的执行计划