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] 从答案我得出的结论是,图形设计器比底层数据库具有更多的功能:
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% 的行。
归档时间: |
|
查看次数: |
10916 次 |
最近记录: |