SQL order by和left outer join没有正确的顺序

时间:2009-01-20 16:38:31

标签: sql-server-2005 left-join sql-order-by

我有一个视图,它连接两个表并按第一个表排序。除了订单不正确。它错过了偶尔的记录,然后最后,大多数记录按顺序存在,然后在那一端,其余的记录按顺序存在。所以它有记录,如

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),

5 个答案:

答案 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很可能是略有不同的版本。有一个已知的修补程序:

http://support.microsoft.com/kb/926292/

答案 4 :(得分:1)

由于排序很慢(N log N),您应该始终在最后一个可能的位置“订购”。在视图上执行选择时,通常会包含where子句。您只想对结果集进行排序。