MSSQL中的遞迴查詢

2022-01-23 04:56:52 字數 1780 閱讀 3155

本人向來很懶,下文均摘自msdn。

公用表表示式 (cte) 具有乙個重要的優點,那就是能夠引用其自身,從而建立遞迴 cte。遞迴 cte 是乙個重複執行初始 cte 以返回資料子集直到獲取完整結果集的公用表表示式。

當某個查詢引用遞迴 cte 時,它即被稱為遞迴查詢。遞迴查詢通常用於返回分層資料,例如:顯示某個組織圖中的雇員或物料清單方案(其中父級產品有乙個或多個元件,而那些元件可能還有子元件,或者是其他父級產品的元件)中的資料。

遞 歸 cte 可以極大地簡化在 select、insert、update、delete 或 create view 語句中執行遞迴查詢所需的**。在 sql server 的早期版本中,遞迴查詢通常需要使用臨時表、游標和邏輯來控制遞迴步驟流。有關公用表表示式的詳細資訊,請參閱使用公用表表示式

。遞迴 cte 的結構

transact-sql 中的遞迴 cte 的結構與其他程式語言中的遞迴例程相似。儘管其他語言中的遞迴例程返回標量值,但遞迴 cte 可以返回多行。

遞迴 cte 由下列三個元素組成:

例程的呼叫。

遞迴 cte 的第乙個呼叫包括乙個或多個由 union all、union、except 或 intersect 運算子聯接的 cte_query_definitions。由於這些查詢定義形成了 cte 結構的基準結果集,所以它們被稱為「定位點成員」。

cte_query_definitions 被視為定位點成員,除非它們引用了 cte 本身。所有定位點成員查詢定義必須放置在第乙個遞迴成員定義之前,而且必須使用 union all 運算子聯接最後乙個定位點成員和第乙個遞迴成員。

例程的遞迴呼叫。

遞迴呼叫包括乙個或多個由引用 cte 本身的 union all 運算子聯接的 cte_query_definitions。這些查詢定義被稱為「遞迴成員」。

終止檢查。

終止檢查是隱式的;當上乙個呼叫中未返回行時,遞迴將停止。

注意

如果遞迴 cte 組合不正確,可能會導致無限迴圈。例如,如果遞迴成員查詢定義對父列和子列返回相同的值,則會造成無限迴圈。在測試遞迴查詢的結果時,可以通過在 insert、update、delete 或 select 語句的 option 子句中使用 maxrecursion 提示和 0 到 32,767 之間的值,來限制特定語句允許的遞迴級數。有關詳細資訊,請參閱查詢提示 (transact-sql)

和 with common_table_expression (transact-sql)

。遞迴 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

遞迴執行的語義如下:

將 cte 表示式拆分為定位點成員和遞迴成員。

執行定位點成員,建立第乙個呼叫或基準結果集 (t0)。

執行遞迴成員,將 ti 作為輸入,將 ti+1 作為輸出。

重複步驟 3,直到返回空集。

返回結果集。這是對 t0 到 tn 執行 union all 的結果。

mssql多級查詢 CTE遞迴

最近做乙個製造業專案中涉及到打包問題,其模式為 乙個a b c 可以無限打包,a包含b,b包含c等。之間遇到了 1 打包後包裹數量需要更新,更新時必須對他的父級包號也進行更新,所以必須查詢出某個包號對應的所有父級包號 2 拆包 將包裹拆除,希望把a下面的包裹號也連同一起拆除,這樣必須查詢出某個包號對...

mssql中的分頁查詢

mssql中的分頁查詢沒有mysql那麼方便,而且由於版本的原因,有些方法不通用,這裡寫一下比較通用的方法 使用top pagesize 處理,然後where 條件加上not in過濾不要的資訊就好了 例如 select top id,type,title,createtime from lyg s...

遞迴在MSSQL開發中的應用

在人力資源管理系統中,常常會有通過工號查詢其所在部門主管的需求,但員工所在部門不一定有主管,可能要在上級才有,這時就需要用遞迴的方式將其主管找出來,mssql create function dbo fn getdepmanager depcode varchar 30 returns varcha...