T-SQL查询:WITH AS 递归计算某部门的所有上级机构或下级机构


IF (OBJECT_ID('DEPT') IS NOT NULL)
	DROP TABLE DEPT
CREATE TABLE DEPT(ID INT,PID INT, NAME VARCHAR(20))

INSERT INTO DEPT VALUES
(1,0,'集团'),
(2,1,'公司A'),
(3,1,'公司B'),
(4,2,'部门A1'),
(5,2,'部门A2'),
(6,2,'部门A3'),
(7,3,'部门B1'),
(8,3,'部门B2'),
(9,5,'小组A2_1'),
(10,8,'小组B2_1')

SELECT * FROM DEPT


--求一个部门的所有下级,如[部门A2] 的所有下级'
;WITH D(ID,PID,NAME,LVL)
AS(
	SELECT ID,PID,NAME,0 LVL FROM DEPT WHERE NAME='部门A2' 
	UNION ALL
	SELECT DEPT.ID,DEPT.PID,DEPT.NAME,LVL +1  
	FROM DEPT INNER JOIN D ON DEPT.PID=D.ID 
)
SELECT * FROM D

/*
ID	PID	NAME		LVL
--	---	---------	---
5	2	部门A2		0
9	5	小组A2_1	1
*/



--求一个部门的所有上级,如[部门B2] 的所有上级'
;WITH D(ID,PID,NAME,LVL)
AS(
	SELECT ID,PID,NAME,0 LVL FROM DEPT WHERE NAME='部门B2'
	UNION ALL
	SELECT DEPT.ID,DEPT.PID,DEPT.NAME,LVL +1  
	FROM DEPT INNER JOIN D ON DEPT.ID=D.PID
)
SELECT * FROM D

/*
ID	PID	NAME	LVL
--	---	------	---
8	3	部门B2	0
3	1	公司B	1
1	0	集团	2
*/





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值