除非另外還指定了 TOP 或 FOR XML,否則,ORDER BY 子句在視圖、內聯(lián)函數、派生表、子查詢和公用表表達式中無效
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
![]() ![]() 除非另外還指定了 TOP 或 FOR XML,否則,ORDER BY 子句在視圖、內聯(lián)函數、派生表、子查詢和公用表表達式中無效SQL 不同于與其他編程語言的最明顯特征是處理代碼的順序。在大數編程語言中,代碼按編碼順序被處理,但是在SQL語言中,第一個被處理的子句是FROM子句,盡管SELECT語句第一個出現,但是幾乎總是最后被處理。 每個步驟都會產生一個虛擬表,該虛擬表被用作下一個步驟的輸入。這些虛擬表對調用者(客戶端應用程序或者外部查詢)不可用。只是最后一步生成的表才會返回 給調用者。如果沒有在查詢中指定某一子句,將跳過相應的步驟。下面是對應用于SQL server 2000和SQL Server 2005的各個邏輯步驟的簡單描述。
(8)SELECT (9)DISTINCT (11)<Top Num> <select list> (1)FROM [left_table] (3)<join_type> JOIN <right_table> (2)ON <join_condition> (4)WHERE <where_condition> (5)GROUP BY <group_by_list> (6)WITH <CUBE | RollUP> (7)HAVING <having_condition> (10)ORDER BY <order_by_list> 邏輯查詢處理階段簡介
注:步驟10,按ORDER BY子句中的列列表排序上步返回的行,返回游標VC10.這一步是第一步也是唯一一步可以使用SELECT列表中的列別名的步驟。這一步不同于其它步驟的 是,它不返回有效的表,而是返回一個游標。SQL是基于集合理論的。集合不會預先對它的行排序,它只是成員的邏輯集合,成員的順序無關緊要。對表進行排序 的查詢可以返回一個對象,包含按特定物理順序組織的行。ANSI把這種對象稱為游標。理解這一步是正確理解SQL的基礎。 因為這一步不返回表(而是返回游標),使用了ORDER BY子句的查詢不能用作表表達式。 表達式包括:視圖、內聯(lián)表值函數、子查詢、派生表和共用表達式。它的結果必須返回給期望得到物理記錄的客戶端應用程序。 例如,下面的派生表查詢無效,并產生一個錯誤: select * from(select orderid,customerid from orders order by orderid) as d 下面的視圖也會產生錯誤 create view my_view as select * from orders order by orderid 在SQL中,表表達式中不允許使用帶有ORDER BY子句的查詢,而在T—SQL中卻有一個例外(應用TOP選項)。 所以要記住,不要為表中的行假設任何特定的順序。換句話說,除非你確定要有序行,否則不要指定ORDER BY 子句。排序是需要成本的,SQL Server需要執(zhí)行有序索引掃描或使用排序運行符。 該文章在 2025/8/23 10:11:46 編輯過 |
關鍵字查詢
相關文章
正在查詢... |