使用一般資料表運算式
一般資料表運算式 (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 有三個資料行 (SalesPersonID、SalesOrderID, and OrderDate),而且會為每位銷售人員定義每年的銷售訂單總數。
USE AdventureWorks2008R2;
GO
-- Define the CTE expression name and column list.
WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)
AS
-- Define the CTE query.
(
SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL
)
-- Define the outer query referencing the CTE name.
SELECT SalesPersonID, COUNT(SalesOrderID) AS TotalSales, SalesYear
FROM Sales_CTE
GROUP BY SalesYear, SalesPersonID
ORDER BY SalesPersonID, SalesYear;
GO
以下是部分結果集:
SalesPersonID TotalSales SalesYear
------------- ----------- -----------
274 4 2001
274 20 2002
274 14 2003
274 10 2004
275 56 2001
275 139 2002
275 169 2003