為什麼視圖中的 ORDER BY 子句在使用 WHERE 子句呼叫時會被忽略?
我有一個連接幾個表的視圖,只是為了簡化一個經常呼叫的查詢。此視圖在計算欄位上有一個 ORDER BY 子句(順序永遠不會不同)。(在 SQL Server Express 2008 R2 上)。
基本構想是這樣的(簡化):
SELECT [EventType].Name, [EventType].TotalOccurrences, [Session].ID, [Session].TotalOccurrences, [Session].TotalOccurrences / [EventType].TotalOccurrences AS saturation FROM [EventType] INNER JOIN [Session] ON [EventType].ID = [Session].Event ORDER BY saturation
但是,如果沒有 where 子句,則永遠不會呼叫此視圖(在我的情況下,它幾乎會返回整個數據庫)。它將永遠與
WHERE [EventType].ID = x
. 但是,只要我添加 where 子句,ORDER BY 子句就會被忽略!如果沒有 where 子句,它會按預期工作。實際上是一個不同的問題,但我在這裡把它扔在這裡,有沒有更好的方法來檢索這些資訊?
[EventType].Name
和[EventType].TotalOccurrences
對於所有返回的行都是相同的,這是網路頻寬的一小部分。這不是一個問題,但我想知道是否有任何東西可以解決這個問題而沒有多次往返數據庫的延遲成本?$$ Edit $$上面的範例過於簡單,計算欄位有其他因素,因此它會返回與
ORDER BY [Session].TotalOccurrences
本範例中不同的順序,但原理應該很清楚。 $$ Edit2 $$從答案中我得出的結論是圖形設計器比底層數據庫具有更多功能:
您發布的查詢對於創建視圖無效;執行
CREATE VIEW xy AS
此查詢將導致錯誤。你用的是TOP
子句嗎?作為表表達式(集合)的視圖不能定義順序,因為這將違反關係模型的原則(關係表中的行沒有順序 - 集合是無序的集合元組)。其他表表達式也是如此 - 派生表、CTE 等。
來自關於該條款 的BOL 文章:
ORDER BY
ORDER BY 子句在視圖、內聯函式、派生表和子查詢中無效,除非還指定了 TOP 或 OFFSET 和 FETCH 子句。在這些對像中使用 ORDER BY 時,該子句僅用於確定由 TOP 子句或 OFFSET 和 FETCH 子句返回的行。當查詢這些構造時,ORDER BY 子句不 保證有序的結果,除非在查詢本身中也指定了 ORDER BY。
長話短說:在引用視圖的外部查詢中**使用
ORDER BY
子句。**不要在視圖中使用它。即使將它與TOP(100) PERCENT
(或在 SQL Server 2012 上,OFFSET-FETCH
等效)一起使用也不能保證呈現順序,它只是意味著您將以任何順序獲得前 100% 的行。