为什么在使用 WHERE claue 调用视图中的 ORDER BY 子句时会被忽略?

Lou*_*ers 4 sql-server order-by sql-server-2008-r2 view

我有一个连接多个表的视图,只是为了简化一个经常调用的查询。此视图在计算字段上有一个 ORDER BY 子句(顺序永远不会不同)。(在 SQL Server Express 2008 R2 上)。

基本思路是这样的(简化):

SELECT [EventType].Name, 
    [EventType].TotalOccurrences, 
    [Session].ID, 
    [Session].TotalOccurrences, 
    [Session].TotalOccurrences / [EventType].TotalOccurrences AS saturation
FROM [EventType]
    INNER JOIN [Session] ON [EventType].ID = [Session].Event
ORDER BY saturation
Run Code Online (Sandbox Code Playgroud)

但是,如果没有 where 子句,则永远不会调用此视图(在我的情况下,它几乎会返回整个数据库)。它将永远与WHERE [EventType].ID = x. 但是,一旦我添加了 where 子句,就会忽略 ORDER BY 子句!如果没有 where 子句,它会按预期工作。

实际上是一个不同的问题,但我在处理的时候把它扔在这里,有没有更好的方法来检索这些信息?的[EventType].Name[EventType].TotalOccurrences将是所有返回的行,这是网络带宽小腰相同。这不是问题,但我想知道是否有任何方法可以解决这个问题,而没有多次往返数据库的延迟开销?

[编辑] 上面的示例过于简化,计算字段有其他因素,因此它会返回与ORDER BY [Session].TotalOccurrences本示例中的简单顺序不同的顺序,但原理应该很清楚。

[Edit2] 从答案我得出的结论是,图形设计器比底层数据库具有更多的功能:

SSMS 中的 Bugus 功能

Bla*_*ler 10

您发布的查询对创建视图无效;运行CREATE VIEW xy AS此查询将导致错误。你在使用TOP子句吗?

作为表表达式(集合)的视图不能定义顺序,因为这违反了关系模型的原则(关系表中的行没有顺序 - 集合是无序的集合)元组)。其他表表达式也是如此 - 派生表、CTE 等。

来自关于该条款的BOL 文章ORDER BY

ORDER BY 子句在视图、内联函数、派生表和子查询中无效,除非还指定了 TOP 或 OFFSET 和 FETCH 子句。在这些对象中使​​用 ORDER BY 时,该子句仅用于确定TOP 子句或 OFFSET 和 FETCH 子句返回的行。ORDER BY 子句在查询这些构造时 保证排序结果,除非在查询本身中也指定了 ORDER BY。

长话短说:在引用视图的外部查询中使用ORDER BY子句。不要在视图中使用它。即使使用它TOP(100) PERCENT(或在 SQL Server 2012 上,OFFSET-FETCH等效的)也不能保证呈现顺序,它只是意味着您将以任何顺序获得前 100% 的行。

  • +1 另见 [要踢的坏习惯:依赖无证行为](http://sqlblog.com/blogs/aaron_bertrand/archive/2010/02/08/bad-habits-to-kick-relying-on-undocumented-行为.aspx) (2认同)