我有一个视图,它连接两个表并按第一个表排序。除了订单不正确。它错过了偶尔的记录,然后最后,大多数记录按顺序存在,然后在那一端,其余的记录按顺序存在。所以它有记录,如
1 (most of the records in order)
2
4
5
6
7
8
10
11
13
15
3 (the first set of missing records)
12
9 (the rest of the missing records)
14
我的观点如下。在我加入之前,我是否需要执行订单?我究竟做错了什么? (我已经获得了这个视图,并且另一个数据库实例中的完全相同的视图正常工作。)
CREATE VIEW [dbo].[SampleView]
AS
SELECT TOP 100 PERCENT blp.*, ISNULL(YEAR(DATEADD(month, 2, tb.[End of D&D])), 0) AS DEMO_FY
FROM dbo.Table1 AS blp LEFT OUTER JOIN
dbo.Table2 AS tb ON blp.FACIL_NAME = tb.[Structure ID]
ORDER BY blp.ID
(编辑)排序字段的类型是[ID] [int] NOT NULL IDENTITY(1,1),
答案 0 :(得分:2)
阅读Create a sorted view in SQL Server 2005 and SQL Server 2008有一个修补程序,您必须在2000兼容模式下运行才能运行。为什么不从视图中选择时执行订单?
答案 1 :(得分:2)
我会完全从视图中删除ORDER BY子句。而是在查询视图时指定您的订单。
答案 2 :(得分:2)
this博客条目中的评论非常清楚。
再一次来自BOL的文字:
“当ORDER BY用于视图,内联函数,派生表或子查询的定义时,该子句仅用于确定TOP子句返回的行.ORDER BY子句不保证有序结果查询这些构造,除非在查询本身中也指定了ORDER BY。“
“虽然视图定义包含ORDER BY子句,但该ORDER BY子句仅用于确定TOP子句返回的行。查询视图本身时,SQL Server不保证结果将被排序,除非您如此明确指定,如以下查询中所示:
SELECT * FROM TopView
ORDER BY LastName
“
答案 3 :(得分:1)
两个SQL Server很可能是略有不同的版本。有一个已知的修补程序:
答案 4 :(得分:1)
由于排序很慢(N log N),您应该始终在最后一个可能的位置“订购”。在视图上执行选择时,通常会包含where子句。您只想对结果集进行排序。