SQL 语句递归查询 With AS 查找所有子节点
createtable#EnterPrise
(
Departmentnvarchar(50),--部门名称
ParentDeptnvarchar(50),--上级部门
DepartManagenvarchar(30)--部门经理
)
insertinto#EnterPriseselect'技术部','总经办','Tom'
insertinto#EnterPriseselect'商务部','总经办','Jeffry'
insertinto#EnterPriseselect'商务一部','商务部','ViVi'
insertinto#EnterPriseselect'商务二部','商务部','Peter'
insertinto#EnterPriseselect'程序组','技术部','GiGi'
insertinto#EnterPriseselect'设计组','技术部','yoyo'
insertinto#EnterPriseselect'专项组','程序组','Yue'
insertinto#EnterPriseselect'总经办','','Boss'
--查询部门经理是Tom的下面的部门名称
;withhgoas
(
select*,0asrankfrom#EnterPrisewhereDepartManage='Tom'
unionall
selecth.*,h1.rank+1from#EnterPrise hjoinhgo h1onh.ParentDept=h1.Department
)
select*fromhgo
/*
Department ParentDept DepartManage rank
--------------- -------------------- ----------------------- -----------
技术部 总经办 Tom 0
程序组 技术部 GiGi 1
设计组 技术部 yoyo 1
专项组 程序组 Yue 2
*/
--查询部门经理是GiGi的上级部门名称
;withhgoas
(
select*,0asrankfrom#EnterPrisewhereDepartManage='GiGi'
unionall
selecth.*,h1.rank+1from#EnterPrise hjoinhgo h1onh.Department=h1.ParentDept
)
select*fromhgo
/*
Department ParentDept DepartManage rank
-------------------- ---------------------- ----------- -----------
程序组 技术部 GiGi 0
技术部 总经办 Tom 1
总经办 Boss 2
*/
如果递归次数大于100,只需在与cte连接的sql 语句的最后加上option (maxrecursion 0) 即可.默认递归
次数为100,设为0表示没有次数限制.