使用一般資料表運算式

一般資料表運算式 (CTE) 可視為在單一 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 陳述式之執行範圍內定義的暫存結果集。CTE 與衍生資料表類似的地方在於,它不會儲存為物件,而且其生命週期僅限於查詢期間。但是與衍生資料表不同的是,CTE 可以自我參考,而且在同一查詢中可參考多次。

CTE 可用於:

  • 建立遞迴查詢。如需詳細資訊,請參閱<使用一般資料表運算式的遞迴查詢>。
  • 在不需要一般用途檢視時替代檢視;亦即,您不需要在中繼資料中儲存定義。
  • 將衍生自純量子選取 (或衍生自不具決定性或具有外部存取之函數) 的資料行組成群組。
  • 在相同陳述式中多次參考結果資料表。

使用 CTE 噁提供更適合閱讀以及易於維護複雜查詢等優點。查詢可分為個別、簡單、邏輯式建置組塊。接著這些簡單組塊可用於建立更為複雜、臨時的 CTE, 直到產生最後的結果集。

CTE 可以定義於使用者自訂常式,如函數、預存程序、觸發程序或檢視。

CTE 結構

CTE 是由代表 CTE 的運算式名稱、選擇性資料行清單以及定義 CTE 的查詢所組成。定義 CTE 之後,就像在 SELECT、INSERT、UPDATE 或 DELETE 陳述式中參考資料表或檢視一樣,也可以參考 CTE。CTE 也能在 CREATE VIEW 陳述式中作為定義 SELECT 陳述式的一部份。

CTE 的基本語法結構:

WITH expression_name [ ( column_name [,...n] ) ]

AS

( CTE_query_definition )

只有在查詢定義提供了所有結果資料行的個別名稱時,資料行名稱清單才是選擇性的。

執行 CTE 的陳述式如下:

SELECT <column_list>

FROM expression_name

範例

以下範例顯示 CTE 結構的元件:運算式名稱、資料行清單和查詢。CTE 運算式 Sales_CTE 有三個資料行 (SalesPersonIDNumberOfOrdersMaxDate),在 SalesOrderHeader 資料表中為每位銷售人員定義銷售訂單總數以及最近銷售清單日期。當陳述式執行後,會參考 CTE 兩次:一次是傳回銷售人員的所選資料行,另一次則是擷取銷售人員主管的類似詳細資料。銷售人員和經理的資料都在單一資料列中傳回。

USE AdventureWorks;
GO
WITH Sales_CTE (SalesPersonID, NumberOfOrders, MaxDate)
AS
(
    SELECT SalesPersonID, COUNT(*), MAX(OrderDate)
    FROM Sales.SalesOrderHeader
    GROUP BY SalesPersonID
)
SELECT E.EmployeeID, OS.NumberOfOrders, OS.MaxDate,
    E.ManagerID, OM.NumberOfOrders, OM.MaxDate
FROM HumanResources.Employee AS E
    JOIN Sales_CTE AS OS
    ON E.EmployeeID = OS.SalesPersonID
    LEFT OUTER JOIN Sales_CTE AS OM
    ON E.ManagerID = OM.SalesPersonID
ORDER BY E.EmployeeID;
GO

以下是部份結果集:

EmployeeID  NumberOfOrders MaxDate  ManagerID NumberOfOrders MaxDate
----------- -------------- ---------- --------- -------------- ----------
268         48             2004-06-01 273       NULL           NULL
275         450            2004-06-01 268       48             2004-06-01
276         418            2004-06-01 268       48             2004-06-01
277         473            2004-06-01 268       48             2004-06-01

請參閱

其他資源

WITH common_table_expression (Transact-SQL)
SELECT (Transact-SQL)
INSERT (Transact-SQL)
UPDATE (Transact-SQL)
DELETE (Transact-SQL)
CREATE VIEW (Transact-SQL)

說明及資訊

取得 SQL Server 2005 協助