我有一个连接几个表的视图,这只是为了简化一个经常被称为查询的查询。此视图在计算字段上有一个ORDER子句(顺序永远不会不同)。(在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但是,如果没有where子句,将永远不会调用此视图(在我的示例中,该子句几乎将返回整个数据库)。它将永远和WHERE [EventType].ID = x在一起。但是,一旦我添加where子句,ORDER子句就会被忽略!如果没有where子句,它将按预期工作。
其实是一个不同的问题,但我把它扔在这里,而我在它,有更好的方法来检索这些信息吗?对于所有返回的行,[EventType].Name和[EventType].TotalOccurrences将是相同的,这是一小部分网络带宽。这不是一个问题,但我想知道是否有什么可以解决这个问题,而不需要多次往返到数据库的延迟开销?
编辑上面的示例过于简化了,计算出的字段还有其他因素,因此它将返回与本例中简单的ORDER BY [Session].TotalOccurrences不同的顺序,但原则应该是明确的。
Edit2从答案中我得出结论,图形设计器比底层数据库具有更多的特性:

发布于 2014-06-01 23:03:33
您发布的查询对于创建视图无效;对此查询运行CREATE VIEW xy AS将导致错误。您使用的是TOP子句吗?
视图是表表达式(集合),不能定义顺序,因为这违背了关系模型的原则(关系表中没有行的顺序--集合是元组的无序集合)。其他表表达式也是如此--派生表、CTE等等。
来自BOL文章关于ORDER BY子句的信息:
ORDER子句在视图、内联函数、派生表和子查询中无效,除非还指定了顶部或偏移量和FETCH子句。当在这些对象中使用ORDER时,子句仅用于确定TOP子句或偏移量和FETCH子句返回的行。ORDER子句不能保证查询这些构造时的有序结果,除非在查询本身中也指定了ORDER。
长话短说:在引用视图的外部查询中使用ORDER BY子句。不要在视图中使用它。即使将它与TOP(100) PERCENT一起使用(或在Server 2012上使用,与OFFSET-FETCH等效)也不能保证表示顺序,这只是意味着您将按任何顺序获得前100%的行。
https://dba.stackexchange.com/questions/66353
复制相似问题