php多表递归查询,使用公用表表达式的递归查询
微軟從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
遞歸執行的語義如下:
將 CTE 表達式拆分為定位點成員和遞歸成員。
運行定位點成員,創建第一個調用或基準結果集 (T0)。
運行遞歸成員,將 Ti 作為輸入,將 Ti+1 作為輸出。
重復步驟 3,直到返回空集。
返回結果集。這是對 T0 到 Tn 執行 UNION ALL 的結果。
示例
————————————————————————————
原表:
現在有一個需求,要查詢出某個省下面的所有市和區(查詢結果包含省)。如果只使用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
查詢結果:
有關使用公用表表達式的詳細信息,請參閱使用公用表表達式的遞歸查詢。
總結
以上是生活随笔為你收集整理的php多表递归查询,使用公用表表达式的递归查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java上传图片到target目录,js
- 下一篇: ecshop nginx php-fpm