2009-01-20 128 views
2

我有一個視圖,即連接兩個表並按第一個表排序。除了訂單不正確。它錯過了一個偶然的記錄,然後在最後,這些記錄大部分是按順序存在的,然後在那個末尾,其餘的記錄依次存在。所以它有如下記錄:SQL順序和左外部連接沒有正確的順序

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 

我的看法如下。在我加入之前是否需要執行訂單?我究竟做錯了什麼? (我已經獲取的該視圖,並且在另一個DB實例完全相同的視圖正常工作。)

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

我不確定這裏有足夠的信息來回答你的問題。瞭解Table1和Table2的表定義或至少相關列的數據類型將是有用的。 – 2009-01-20 16:41:21

回答

2

我會從視圖中完全刪除ORDER BY子句。相反,請在查詢視圖時指定您的訂單。

2

this博客條目的評論使它很清楚。

只是再次從BOL文本:

「當ORDER BY在視圖,內聯函數,派生表或子查詢的定義時,該子句僅用於確定返回的行ORDER BY子句不保證查詢這些結構時的有序結果,除非ORDER BY也在查詢本身中指定。「

「儘管視圖定義包含ORDER BY子句,但該子句僅用於確定TOP子句返回的行。查詢視圖本身時,SQL Server不保證結果將被排序,除非您指定如此明確,如在下面的查詢:

SELECT * FROM TopView 
ORDER BY LastName 

1

你應該總是‘爲了’在最後可能的點,因爲排序是緩慢的(N日誌N)。在視圖上執行選擇時,通常會包含一個where子句。你只想對結果集進行排序。