2009-08-20 100 views
11

我们有一个视图在我们的数据库中有一个ORDER BY。 现在,我意识到视图通常不会排序,因为不同的人可能会将它用于不同的事情,并希望它以不同的顺序排列。然而,这个视图用于需要特定顺序的非常具体的用例。 (这是一个足球联赛的团队排名)。ORDER BY在Sql Server 2008视图中

该数据库是在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对视图,它定购由性别,TEAMYEAR结果,CODE,TEAMID。请注意,它是按TEAMID而不是POINTS按order by clause指定。

但是,如果我复制SQL语句并按照在新查询窗口中的原样运行它,它将按照ORDER BY子句中的指定正确地进行排序。

回答

19

从不保证视图带有ORDER BY子句返回的行的顺序。如果您需要特定的行顺序,则必须指定从视图中选择的位置。

请参阅this Book On-Line顶部的注释条目。

+0

这很烦人!我可以看到/理解不能在VIEW中保证它,但它至少应该以表值函数工作。哎呀。无论如何感谢您的答案。 :) – eidylon 2009-08-20 14:27:18

19

SQL Server 2005按设计忽略TOP 100 PERCENT。

改为尝试TOP 2000000000。

现在,我将试图找到一个参考......我是在用谁提到

Itzak奔甘呈现研讨会发现了一些...

Kimberly L. Tripp

"TOP 100 Percent ORDER BY Considered Harmful"

在这种特定情况下,优化 承认TOP 100%的 资格的所有行和根本不需要计算 。

+0

我很好奇这个SQL服务器修补程序我只是偶然发现:http://support.microsoft.com/kb/926292:如果我正确地读它,然后修补程序'修复'要排序的行为? – 2012-02-13 15:09:19

+0

@MitchWheat:是的,看起来很熟悉。我认为这意味着内部TOP..ORDER BY fubars外部ORDER BY – gbn 2012-02-13 15:13:01

+0

我不确定它确实。它似乎说,应用此修补程序将保证在视图中的ORDER BY总是有效(这显然与MSDN文章相矛盾(并且可能是很好的意义!)) – 2012-02-13 15:31:30

2

运行数据库上探查器跟踪,看看这实际上正在运行,当你查询你的视图的查询。

您也可能想要考虑使用存储过程从您的视图中返回数据,为您的特定用例正确排序。

+0

是的,我真的在寻找可直接查询的东西,虽然...视图,表值函数,这是一个存储过程不是。 – eidylon 2009-08-20 14:30:10

4

只需使用:

顶(99)百分比

“顶(数字1000倍以上,您的数据行一样24682468123)” 它的作品!去尝试一下。

4

在SQL Server 2008中,ORDER BY在使用TOP 100 PERCENT的视图中被忽略。在以前的SQL服务器版本中,只有在使用TOP 100 PERCENT的情况下才允许ORDER BY,但从未保证完美的订单。不过,许多人认为完美的订单是有保证的。我推断微软不想误导程序员和数据库管理员相信使用这种技术有保证的顺序。

这种不准确性的一个很好的比较论证,可以在这里找到...

http://blog.sqlauthority.com/2009/11/24/sql-server-interesting-observation-top-100-percent-and-order-by

哎呀,我刚才注意到,这已经回答了。但是检查比较示范无论如何值得一看。

2

我找到了一个替代的解决方案。

我最初的计划是创建一个'sort_order'列,以防止用户执行复杂的排序。

我用了一个窗口函数ROW_NUMBER。在ORDER BY子句中,我指定了我需要的默认排序顺序(就像它在SELECT语句的ORDER BY中一样)。

我得到一些积极的成果:

  1. 默认情况下,该数据是越来越在我原本的默认排序顺序返回(这可能是由于不必分配之前对数据进行排序的窗口函数在SORT_ORDER值)

  2. 其他用户,如果他们选择

  3. 以另一种方式对数据进行排序的列SORT_ORDER有一个非常具体的某种需要,使其更容易FO r用户应该使用他们使用的任何工具重新排列行。

注:在我的具体应用,用户通过Excel 2010中访问视图,默认情况下将数据提供给因为我已经没有进一步排序需要希望用户。

希望这可以帮助那些有类似问题的人。

干杯, 瑞安