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 和索引视图中的执行计划

基于 SQL server 2008 中的属性从大型数据库创建视图

SQL SERVER2008 存储过程表视图函数的权限