2

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

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

4

5 回答 5

2

阅读在 SQL Server 2005 和 SQL Server 2008 中创建排序视图有一个修补程序,您必须在 2000 兼容模式下运行它才能工作。为什么不只是在从视图中选择时进行排序?

于 2009-01-20T16:46:07.293 回答
2

我会从视图中完全删除 ORDER BY 子句。相反,请在查询视图时指定您的订单。

于 2009-01-20T16:47:52.003 回答
2

博客条目中的评论非常清楚。

再次来自 BOL 的文本:

“当在视图、内联函数、派生表或子查询的定义中使用 ORDER BY 时,该子句仅用于确定由 TOP 子句返回的行。当这些构造为时,ORDER BY 子句不保证有序结果查询,除非在查询本身中也指定了 ORDER BY。”

“虽然视图定义包含一个 ORDER BY 子句,但该 ORDER BY 子句仅用于确定 TOP 子句返回的行。在查询视图本身时,SQL Server 不保证结果将被排序,除非您明确指定,如以下查询所示:

SELECT * FROM TopView
ORDER BY LastName

"

于 2009-01-20T17:05:35.710 回答
1

这两个 SQL Server 很可能是略有不同的版本。有一个已知的修补程序:

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

于 2009-01-20T16:43:24.693 回答
1

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

于 2009-01-20T17:15:09.700 回答