我有两张桌子
[LocatioNo],[LocationName],[Description])[LocationNo],[LocationCode],[DDate],[BillNo],[Model],[Quantity],[SNo])
(来源:staticflickr.com)
](http://www.flickr.com/photos/77377790@N08/6782618850 “点击查看Flickr”)
以及涉及在 SQL Server 2000 中创建的 2 个表的视图
CREATE VIEW [dbo].[QueryLocation]
AS
SELECT TOP (100) PERCENT
dbo.LocationData.LocationNo, dbo.LocationData.LocationCode,
dbo.LocationData.DDate, dbo.LocationData.BillNo,
dbo.LocationData.Model,
SUM(dbo.LocationData.Quantity) AS Quantity,
dbo.LocationMaster.LocationName
FROM
dbo.LocationData
INNER JOIN
dbo.LocationMaster ON dbo.LocationData.LocationNo = dbo.LocationMaster.LocatioNo
GROUP BY
dbo.LocationMaster.LocationName, dbo.LocationData.LocationNo,
dbo.LocationData.LocationCode, dbo.LocationData.DDate, dbo.LocationData.BillNo,
dbo.LocationData.Model ORDER BY dbo.LocationData.BillNo
Run Code Online (Sandbox Code Playgroud)
在 SQL Server 2000 中执行以下查询时,网格中的结果按billno列排序。
SELECT * FROM QueryLocation
Run Code Online (Sandbox Code Playgroud)

(来源:staticflickr.com)
](http://www.flickr.com/photos/77377790@N08/6782618858 “点击查看 Flickr”)
升级到 SQL Server 2008 后,执行时相同的查询未按账单无字段排序
建议为什么这不在 group by 列上排序
提前致谢
小智 11
ORDER BY 视图中只是一个损坏的“功能”(尽管企业经理似乎鼓励这种功能)。
在大多数情况下,视图意味着与表无法区分。表没有固有的顺序。
这意味着 an 唯一ORDER BY能保证影响结果返回顺序的地方是在最外面SELECT——即引用这个视图的那个(假设那个SELECT,反过来,不在另一个视图或 UDF 中)
在一个视图中,UDF 等ORDER BY只是为了它的其他/重载目的而工作 -TOP有意义 - 即没有ORDER BY,要求TOP 10将定义不明确,因为同样,表没有固有的顺序。
不幸的是,有一个共同的错误看法,即这工作,因为在企业管理器和Management Studio中的图形视图设计师实际上鼓励了-有“排序”功能包括有,如果你使用它们,刀具刀片 TOP 100 PERCENT和ORDER BY-尽管这有至少从 2005 年起就行不通了。
刚刚重新阅读的问题-它是依托于订单的GROUP BY?这使一个问题与另一个问题复杂化。不能保证涉及 a 的语句的输出GROUP BY具有任何特定顺序。
在 SQL Server 2012 中,如果您尝试使用视图设计器创建有序视图,则会收到以下警告:
警告:ORDER BY 子句仅用于确定视图定义中的 TOP 子句返回的行。ORDER BY 子句不保证查询视图时的有序结果,除非在查询本身中也指定了 ORDER BY。单击取消以放弃您的修改。单击“确定”保存视图。
我不确定在 2008/2008 R2 的最新版本中是否会发生这种情况。
虽然我认为继续允许语法是绝对愚蠢的,并且让视图设计者延续这种类型的排序意味着除了过滤器(当 TOP = 100% 时不包括 0 行)之外的任何东西的神话,这就是他们认为的“固定”根据以连接编号249248。我已经发表评论寻求确认,但主要是我的观点是保存警告不够好。如果我只是使用视图设计器来生成 SQL,然后我将把它粘贴到其他地方的CREATE VIEW或ALTER VIEW脚本中怎么办?
无论如何,在这个和其他错误中发现的措辞,以及这里的其他答案,应该确认你的逻辑是错误的:ORDER BY/GROUP BY在视图中绝对没有保证优化器如何从视图中返回行。即使在视图使用之外的查询中GROUP BY,这也不会规定排序。如果你想保证顺序,你绝对必须申请ORDER BY最外层的查询。如需更多阅读,请参阅此博客文章。
它没有排序,因为按视图排序是不合法的。事实上,如果您尝试在没有 TOP (100) PERCENT 语句的情况下对视图上的列进行 ORDER BY,您将收到错误。为什么 SQL Server 允许 TOP 和 ORDER BY?因为如果您要选择 100% 以外的任何行,则 ORDER BY 本质上将与 TOP 结合使用来过滤行。
为什么 SQL 2000 允许这样做?这是 SQL 2000 优化器的一个特性,并且您的不合规代码“侥幸逃脱”。可以这样想——SQL 2008(2005 也表现出了这种行为)的设计者必须做出选择,他们是否要让视图运行得更快并忽略这样的代码,或者是否要减慢速度向下视图执行只是为了支持无效的编码结构。
这个故事的寓意是,您不能对视图进行 ORDER BY——您永远无法真正做到。所有 ORDER BY 语句必须由查询视图本身的查询执行。
您可以尝试一些技巧,但只有在您绝对无法更新查询视图的代码时才可以使用它们。我不会依赖它们或推荐它们进行任何未来或当前的开发。
| 归档时间: |
|
| 查看次数: |
2015 次 |
| 最近记录: |