sql递归查询

项目需求:
需要获取部门表的递归数据。
示例表数据:
在这里插入图片描述
利用sql语法中的 recursive关键字

递归查询:
关键字-recursive 递归层级-mu_level
数据库版本:MySQL 8.0.12 PostgreSQL 10.17

- 查找父级信息

-- 找父级
with recursive role_table (dept_code,dept_name,dept_pcode,mu_level)
as (
	select dt.dept_code,dt.dept_name,dt.dept_pcode,0 as mu_level from sys_dept dt
	where dt.dept_code = '100101'
	union all
	//已知的是子集,所以我们通过role_table的dept_pcode 匹配 sys_dept的dept_code
	select dt.dept_code,dt.dept_name,dt.dept_pcode,mu_level+1 from sys_dept dt
	inner join role_table rt on rt.dept_pcode = dt.dept_code
)
select rt.* from role_table rt 

查询结果:
在这里插入图片描述

- 查找子级信息

-- 找子级
with recursive role_table (dept_code,dept_name,dept_pcode,mu_level)
as (
	select dt.dept_code,dt.dept_name,dt.dept_pcode,0 as mu_level from sys_dept dt
	where dt.dept_code = '1001'
	union all
	select dt.dept_code,dt.dept_name,dt.dept_pcode,mu_level+1 from sys_dept dt
	inner join role_table rt on rt.dept_code = dt.dept_pcode
)
select rt.* from role_table rt 

查询结果:
在这里插入图片描述

附:表结构和数据

-- 建表
CREATE TABLE `sys_dept` (
  `dept_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '部门id',
  `dept_code` varchar(50) NOT NULL COMMENT '部门编码',
  `dept_name` varchar(10) NOT NULL COMMENT '部门名称',
  `dept_pcode` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '上级部门代码',
  PRIMARY KEY (`dept_id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
-- 数据
INSERT INTO `clothes`.`sys_dept`(`dept_id`, `dept_code`, `dept_name`, `dept_pcode`) VALUES (1, '10', '龙睿集团', NULL);
INSERT INTO `clothes`.`sys_dept`(`dept_id`, `dept_code`, `dept_name`, `dept_pcode`) VALUES (2, '1001', '龙睿科技', '10');
INSERT INTO `clothes`.`sys_dept`(`dept_id`, `dept_code`, `dept_name`, `dept_pcode`) VALUES (3, '100101', '研发中心', '1001');
INSERT INTO `clothes`.`sys_dept`(`dept_id`, `dept_code`, `dept_name`, `dept_pcode`) VALUES (4, '10010101', 'Java组', '100101');
INSERT INTO `clothes`.`sys_dept`(`dept_id`, `dept_code`, `dept_name`, `dept_pcode`) VALUES (5, '10010102', '产品UI', '100101');
INSERT INTO `clothes`.`sys_dept`(`dept_id`, `dept_code`, `dept_name`, `dept_pcode`) VALUES (6, '10010103', 'H5大前端', '100101');
INSERT INTO `clothes`.`sys_dept`(`dept_id`, `dept_code`, `dept_name`, `dept_pcode`) VALUES (7, '100102', '行政人事部', '1001');

参考文章:
https://www.jb51.net/article/202247.htm
https://www.bianchengquan.com/article/340193.html
Thanks♪(・ω・)ノ

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值