微軟從SQL2005起引入了CTE(Common Table Expression)以強化T-SQL。 公用表表達式?(CTE)?具有一個重要的長處,那就是可以引用其自身。從而創建遞歸?CTE。遞歸?CTE?是一個反復運行初始?CTE?以返回數據子集直到獲取完整結果集的公用表表達式。 當某個查詢引用遞歸?CTE?時。它即被稱為遞歸查詢。遞歸查詢通經常使用于返回分層數據,比如:顯示某個組織圖中的雇員或物料清單方案(當中父級產品有一個或多個組件,而那些組件可能還有子組件,或者是其它父級產品的組件)中的數據。 遞歸?CTE?能夠極大地簡化在?SELECT、INSERT、UPDATE、DELETE?或?CREATE VIEW?語句中執行遞歸查詢所需的代碼。在?SQL Server?的早期版本號中。遞歸查詢通常須要使用暫時表、游標和邏輯來控制遞歸步驟流。有關公用表表達式的具體信息。請參閱使用公用表表達式。 ? 偽代碼和語義 ———————————————————————————— 遞歸?CTE?結構必須至少包括一個定位點成員和一個遞歸成員。下面偽代碼顯示了包括一個定位點成員和一個遞歸成員的簡單遞歸?CTE?的組件。 WITH?cte_name?(?column_name [,...n]?) AS ( CTE_query_definition?–- Anchor member is defined. UNION?ALL CTE_query_definition?–- Recursive member is defined referencing cte_name. ) -- Statement using the CTE SELECT?*?FROM?cte_name 遞歸運行的語義例如以下:
? 演示樣例 ———————————————————————————— 原表: ? ? 如今有一個需求,要查詢出某個省以下的全部市和區(查詢結果包括省)。假設僅僅使用SQL語句來實現,須要使用到游標、暫時表等技術。 但在SQL Server2005中還能夠使用CTE來實現。 ? WITH?district AS ( ????--獲得第一個結果集,并更新終于結果集 ????SELECT?*?FROM?t_tree?WHERE?id?=?0 ????UNION?ALL ????--以下的select語句首先會依據從上一個查詢結果集中獲得的id值來查詢parent_id ????--字段的值,然后district就會變當前的查詢結果集。并繼續運行以下的select?語句 ????--假設結果集不為null。則與終于的查詢結果合并,同一時候用合并的結果更新終于的查 ????--詢結果;否則停止運行。 最后district的結果集就是終于結果集。 ????SELECT a.* FROM?t_tree aINNER JOIN district?bONa.parent_id = b.id ) SELECT?*?FROM?district ? 查詢結果: ? 有關使用公用表表達式的具體信息,請參閱使用公用表表達式的遞歸查詢。 |
轉載于:https://www.cnblogs.com/bhlsheji/p/5112810.html