SQL server递归获取部门信息以及数据库表优化设计

本文讨论了在SQL Server中如何使用递归查询删除包含下级部门的记录,并提出了一种优化数据库设计的方法,通过code和parentCode字段替代parentId来简化层级关系查询,避免递归操作,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预设条件:公司下设置三级部门信息,部门表Department字段设计如下,其中有四个字段(公司ID未体现):

id:部门ID,自增主键;
           name:部门名字;
           parentId:父级部门ID;
           deleted:是否删除,0未删除,1已删除。

现在要删除部门信息,可以想到在删除部门信息的时候,如果删除的是一级部门,那么它下面的二级部门和三级部门也要删除。这时,我需要根据要删除的部门的部门ID,得到此部门的下级部门ID们。

现有表数据如下(一级部门的parentId设置为0):

 我们可以看到它的部门结构如下:

如果在删除部门的接口中,我们传入的部门id为10003,我们希望把部门ID为10003, 10004,10005, 10006, 10008的数据一起删除。这里使用了SQL server的递归查询获取所有的下级部门ID:

可以看到查询出了部门Id为10003的所有下级部门ID和他自己本身的ID。上面的ID可以放到Set里面,这样我们可以根据Set进行批量删除。

上面展示的sql如下:

with temp ([id])
as
(
select id
from Department
where [id] = 10003
union all
select a.id
from Department a
inner join temp on a.[parentId] = temp.[id] and deleted = 0
)
select * from temp

数据库设计优化:

在设计数据库的时候,涉及到一级二级三级的信息,又是存储在同一张表里面的,可以不设置parentId字段,用code和parentCode两个字段来展示上下级的关系(此处省去公司信息)。如下所示:

idnamecodeparentCodedeleted
1技术部10000
2前端1001001000
3后端1001011000
4Java开发1001011001001010
5python开发1001011011001010
6财务部10100
7人事部10200

code用固定的位数来表示,同一个公司下的一级部门从100开始,每增加一个一级部门,就在已有的最大部门code上加1,二级部门为上级部门code后面加上三位,加的三位也是从100开始。以此类推。这样同一公司的一级部门有999个位置,每个部门的下级部门也有999个位置。如果数据量大的,可以给一级设置为4位的code,这样每级都有9999个位置。

这样当我们获取某部门和它的下级部门的id的时候,我们就不需要递归查询,而是用一个简单的子查询就可以了:

SELECT id FROM Department WHERE (SELECT code from Department WHERE id = 1) = LEFT(code,3);

可以看出,层级关系更加鲜明了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值