Common Table Expression (CTE),即「公用資料表運算式」,SQL Server 2005 引入。以 WITH 關鍵字開頭,定義一個暫時命名的結果集,僅在緊隨其后的單一陳述式(SELECT/INSERT/UPDATE/DELETE/MERGE)範圍內可見。類似「語句級視圖」,不持久化、不佔用儲存空間。
WITH 內)UNION ALL 遞迴成員)WITH cte_name [(col1, col2, ...)] AS (
-- 定義查詢
SELECT ...
)
-- 緊接單一陳述式引用 CTE
SELECT * FROM cte_name;
-- 原始:難讀的巢狀子查詢
SELECT * FROM person.StateProvince
WHERE CountryRegionCode IN (
SELECT CountryRegionCode FROM person.CountryRegion WHERE Name LIKE 'C%'
);
-- CTE 版:清晰分層
WITH cr AS (
SELECT CountryRegionCode FROM person.CountryRegion WHERE Name LIKE 'C%'
)
SELECT * FROM person.StateProvince
WHERE CountryRegionCode IN (SELECT * FROM cr);
WITH
cte1 AS (SELECT * FROM table1 WHERE name LIKE 'abc%'),
cte2 AS (SELECT * FROM table2 WHERE id > 20),
cte3 AS (SELECT * FROM table3 WHERE price < 100)
SELECT a.* FROM cte1 a JOIN cte2 b ON a.id = b.id JOIN cte3 c ON a.id = c.id;
WITHCOMPUTE、ORDER BY(除非有 TOP)、INTO、OPTION、FOR XML/BROWSEWITH OrgTree AS (
-- 錨點成員:根節點
SELECT OrganiseUnitID, ParentOrganiseUnitID, OrganiseName, 0 AS Level
FROM OrganiseUnit WHERE ParentOrganiseUnitID IS NULL
UNION ALL
-- 遞迴成員:子節點
SELECT ou.OrganiseUnitID, ou.ParentOrganiseUnitID, ou.OrganiseName, ot.Level + 1
FROM OrganiseUnit ou
INNER JOIN OrgTree ot ON ou.ParentOrganiseUnitID = ot.OrganiseUnitID
)
SELECT * FROM OrgTree ORDER BY Level, OrganiseUnitID;
OPTION (HASH JOIN) 等提示),每次引用重新執行#temp 或 INSERT INTO #temp SELECT ... FROM CTE 物化OPTION (MAXRECURSION n) 調整(0 = 無限制)