我有一个连接几个表的视图,只是为了简化一个经常调用的查询。此视图在计算字段上有一个 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
但是,如果没有 where 子句,则永远不会调用此视图(在我的情况下,它几乎会返回整个数据库)。它将永远与WHERE [EventType].ID = x
. 但是,只要我添加 where 子句,ORDER BY 子句就会被忽略!如果没有 where 子句,它会按预期工作。
实际上是一个不同的问题,但我在这里把它扔在这里,有没有更好的方法来检索这些信息?[EventType].Name
和[EventType].TotalOccurrences
对于所有返回的行都是相同的,这是网络带宽的一小部分。这不是一个问题,但我想知道是否有任何东西可以解决这个问题而没有多次往返数据库的延迟开销?
[编辑] 上面的示例过于简单,计算字段有其他因素,因此它返回的顺序与ORDER BY [Session].TotalOccurrences
本示例中的简单顺序不同,但原理应该很清楚。
[Edit2] 从答案中我得出的结论是图形设计器比底层数据库具有更多功能:
您发布的查询对于创建视图无效;运行
CREATE VIEW xy AS
此查询将导致错误。你用的是TOP
从句吗?作为表表达式(集合)的视图不能定义顺序,因为这将违反关系模型的原则(关系表中的行没有顺序 - 集合是无序的集合元组)。其他表表达式也是如此 - 派生表、CTE 等。
来自关于该条款 的BOL 文章:
ORDER BY
长话短说:在引用视图的外部查询中使用
ORDER BY
子句。不要在视图中使用它。即使将它与TOP(100) PERCENT
(或在 SQL Server 2012 上,OFFSET-FETCH
等效)一起使用也不能保证呈现顺序,它只是意味着您将以任何顺序获得前 100% 的行。