SQL递归CTE查询(;with xxx as)

/*查询CTE公司总部下所有的分公司及分部*/

------------------------------------------------------
------------------------------------------------------
----创建表、数据
------------------------------------------------------
------------------------------------------------------

--清除tbl_lzw_Dept
IF exists(SELECT * from sysobjects where id= OBJECT_ID('tbl_lzw_Dept'))
BEGIN
	DROP TABLE tbl_lzw_Dept
END 
GO

CREATE TABLE tbl_lzw_Dept
(
	DeptID INT IDENTITY(1,1),
	DeptName varchar(100),
	ParentID INT
)


INSERT INTO tbl_lzw_Dept values('公司总部',0)--DeptID=1
INSERT INTO tbl_lzw_Dept values('广东分公司',1)--DeptID=2
INSERT INTO tbl_lzw_Dept values('浙江分公司',1)--DeptID=3
INSERT INTO tbl_lzw_Dept values('湖南分公司',1)--DeptID=4
INSERT INTO tbl_lzw_Dept values('香港分公司',1)--DeptID=5
INSERT INTO tbl_lzw_Dept values('珠海分部',2)
INSERT INTO tbl_lzw_Dept values('广州分部',2)
INSERT INTO tbl_lzw_Dept values('深圳分部',2)
INSERT INTO tbl_lzw_Dept values('杭州分部',3)
INSERT INTO tbl_lzw_Dept values('长沙分部',4)
INSERT INTO tbl_lzw_Dept values('株洲分部',4)
INSERT INTO tbl_lzw_Dept values('湘潭分部',4)
INSERT INTO tbl_lzw_Dept values('尖沙咀分部',5)

GO



------------------------------------------------------
------------------------------------------------------
----执行查询
------------------------------------------------------
------------------------------------------------------

DECLARE @DeptID INT
--SET @DeptID=1 --查询总部公司下所有的子公司及分部
--SET @DeptID=2 --查询广东分公司所有分部
SET @DeptID=5 --查询香港分公司所有分部



;with dtDept as
(
select DeptID,DeptName,ParentID,0 AS LevelID from tbl_lzw_Dept WHERE ParentID=@DeptID
UNION ALL
SELECT a.DeptID,a.DeptName,a.ParentID,(LevelID+1) AS LevelID
from tbl_lzw_Dept a
INNER JOIN
dtDept b ON a.ParentID=b.DeptID
)

SELECT * FROM dtDept


 原理(摘自网上)

  递归CTE最少包含两个查询(也被称为成员)。第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点。第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。

递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数的最大限制时才停止递归。是指递归次数上限的方法是使用MAXRECURION。



你可能感兴趣的:(sql,server)