CTE递归应用,树状结构,查询所有子部门、子部门数量、按层级显示部门名称

</pre><pre name="code" class="sql">-- 建立演示环境
CREATE TABLE Dept(
	id int PRIMARY KEY, 
	parent_id int,
	name nvarchar(20))
INSERT Dept
SELECT 0, 0, N'<全部>' UNION ALL
SELECT 1, 0, N'财务部' UNION ALL
SELECT 2, 0, N'行政部' UNION ALL
SELECT 3, 0, N'业务部' UNION ALL
SELECT 4, 0, N'业务部' UNION ALL
SELECT 5, 4, N'销售部' UNION ALL
SELECT 6, 4, N'MIS' UNION ALL
SELECT 7, 6, N'UI' UNION ALL
SELECT 8, 6, N'软件开发' UNION ALL
SELECT 9, 8, N'内部开发'
GO

-- 查询指定部门下面的所有部门及按层级显示部门名称
DECLARE @Dept_name nvarchar(20)
SET @Dept_name = N'MIS'
;WITH
DEPTS AS(
	-- 定位点成员
	SELECT *,CAST(NAME AS VARCHAR(100)) AS Fname
	FROM Dept
	WHERE name = @Dept_name
	UNION ALL
	-- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
	SELECT A.*,CAST(b.Fname+'/'+a.NAME AS VARCHAR(100)) AS Fname
	FROM Dept A, DEPTS B
	WHERE A.parent_id = B.id
)
SELECT * FROM DEPTS
GO

-- 查询指定部门下面的所有部门, 并汇总各部门的下级部门数
DECLARE @Dept_name nvarchar(20)
SET @Dept_name = N'MIS'
;WITH
DEPTS AS(			-- 查询指定部门及其下的所有子部门
	-- 定位点成员
	SELECT * FROM Dept
	WHERE name = @Dept_name
	UNION ALL
	-- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
	SELECT A.*
	FROM Dept A, DEPTS B
	WHERE A.parent_id = B.id
),
DEPTCHILD AS(		-- 引用第1个CTE,查询其每条记录对应的部门下的所有子部门
	SELECT 
		Dept_id = P.id, C.id, C.parent_id
	FROM DEPTS P, Dept C
	WHERE P.id = C.parent_id
	UNION ALL
	SELECT 
		P.Dept_id, C.id, C.parent_id
	FROM DEPTCHILD P, Dept C
	WHERE P.id = C.parent_id
),
DEPTCHILDCNT AS(	-- 引用第2个CTE, 汇总得到各部门下的子部门数
	SELECT 
		Dept_id, Cnt = COUNT(*)
	FROM DEPTCHILD
	GROUP BY Dept_id
)
SELECT				-- JOIN第1,3个CTE,得到最终的查询结果
	D.*,
	ChildDeptCount = ISNULL(DS.Cnt, 0)
FROM DEPTS D
	LEFT JOIN DEPTCHILDCNT DS
		ON D.id = DS.Dept_id
GO





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值