用公共表表达式完成一些对特殊部门的操作

SQL查询顶级子部门
本文介绍了一种使用SQL Server创建递归查询的方法,通过自定义函数fn_getSubDep获取特定顶级部门的所有子部门,并筛选出不含学校的直接子部门。
--题目:如下面, 求出所有顶级下的子级(仅子级,不含再下一级),要求是子级或者子级的下面不包含学校
--顶级
------处长室
------------科长室0
------------科长室1
------宣传部
------科苑小学
------初中部
------------兰州中学
------高中部
------------兰州高中
--1. 创建部门表及测试数据
IF OBJECT_ID('Dep') IS NOT NULL
BEGIN
	DROP TABLE Dep
END
GO
CREATE TABLE Dep(
	id INT,
	pId INT,
	[name] VARCHAR(200),	
	isSchool BIT	/*是否为学校*/
)
GO
INSERT INTO Dep
SELECT 1,0,'顶级',0 union
SELECT 2,1,'处长室',0 union
SELECT 3,2,'科长室0',0 union
SELECT 4,2,'科长室1',0 union
SELECT 5,1,'宣传部',0 union
SELECT 6,1,'科苑小学',1 union
SELECT 7,1,'初中部',0 union
SELECT 8,7,'兰州中学',1 union
SELECT 9,1,'高中部',1 union
SELECT 10,9,'兰州高中',0

--SELECT * FROM Dep d

--2. 创建查询所有子级单位的函数
IF OBJECT_ID('fn_getSubDep') IS NOT NULL
BEGIN
	DROP FUNCTION dbo.fn_getSubDep
END
GO

CREATE FUNCTION fn_getSubDep( @depId INT )
RETURNS TABLE
AS
RETURN(
	WITH cte(id,pId,NAME,isSchool, level)
	AS
	(
		SELECT id,pid,NAME,isSchool, 0
		FROM Dep d WHERE id=@depId
		UNION ALL
		SELECT d2.id,d2.pid,d2.NAME,d2.isSchool, cte.[level]+1 
		FROM Dep d2 JOIN cte ON d2.pid = cte.id	
	)
	SELECT * FROM cte
)
GO
--SELECT * FROM dbo.fn_getSubDep(2)

--3. 求出所有顶级下的子级(仅子级,不含再下一级),要求是子级或者子级的下面不包含学校
WITH cte(id,pId,NAME,isSchool)
AS
(	
	SELECT id,pId,NAME,isSchool FROM dbo.fn_getSubDep(1) t1
	WHERE LEVEL=1 AND isSchool=0
	AND NOT EXISTS(
		SELECT 1 FROM dbo.fn_getSubDep(t1.id) WHERE isSchool=1	
	)
)
SELECT * FROM cte


转载于:https://www.cnblogs.com/pangblog/p/3239169.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值