首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在使用WHERE claue调用时视图中的ORDER子句被忽略?

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

Database Administration用户
提问于 2014-06-01 22:01:57
回答 1查看 12.4K关注 0票数 5

我有一个连接几个表的视图,这只是为了简化一个经常被称为查询的查询。此视图在计算字段上有一个ORDER子句(顺序永远不会不同)。(在2008 R2上)

基本思想如下(简化):

代码语言:javascript
复制
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从答案中我得出结论,图形设计器比底层数据库具有更多的特性:

EN

回答 1

Database Administration用户

回答已采纳

发布于 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%的行。

票数 11
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/66353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档