MySql语句 递归寻找某输入部门的所有下级部门
一.前言 假设有下面这张表,depart_id为部门的id,depart_name为部门名称,depart_upid为上级部门的id。 要求:利用sql语句,输入某部门id,查询该部门所有下级的id。 二.解决思路 在Mysql上自定义一个函数(Function),采用递归查找。 这里因为自己数据库版...
·
一.前言
假设有下面这张表,depart_id为部门的id,depart_name为部门名称,depart_upid为上级部门的id。
要求:利用sql语句,输入某部门id,查询该部门所有下级的id。
二.解决思路
在Mysql上自定义一个函数(Function),采用递归查找。
这里因为自己数据库版本问题无法使用函数,改用存储过程来实现。
具体实现如下:
DROP PROCEDURE IF EXISTS `getChild`; #若该方法已存在,则销毁
CREATE PROCEDURE `getChild` (rootId VARCHAR(40)) #声明方法名和输入参数
BEGIN
DECLARE ptemp VARCHAR (40); #用于存储输出的depart_id字符串集
DECLARE ctemp VARCHAR (40); #用于存储当前的depart_id
SET ptemp = '';
SET ctemp = rootId;
WHILE ctemp IS NOT NULL DO
IF ptemp = '' THEN #判断是否为第一次查询,解决查询结果第一位为','的问题
SET ptemp = concat(ptemp, ctemp);
ELSE
SET ptemp = concat(ptemp, ',', ctemp);
end if;
#group_conca保存后面符合条件的depart_id FIND_IN_SET查询当前ctemp里是否有与depart_upid相等的值
SELECT group_concat(depart_id) INTO ctemp FROM tab_depart WHERE FIND_IN_SET(depart_upid, ctemp) > 0;
END WHILE;
SELECT ptemp;
END;
CALL getChild('1'); #调用存储过程
上面的语句输入 depart_id='1' ,输出如下:
另外附赠一个SqlServer的查询语句,利用with,能实现相同功能。
/*查询DEPART_ID的所有下级单位信息 包括自己*/
WITH DEPART_ID_Tree AS
(
SELECT * from TAB_depart where DEPART_ID='3'
UNION ALL
SELECT TAB_DEPART.* from DEPART_ID_Tree
JOIN TAB_DEPART on DEPART_ID_Tree.DEPART_ID = TAB_DEPART.DEPART_UPID
)
SELECT * FROM DEPART_ID_Tree;
/*查询DEPART_ID的所有上级单位信息 包括自己*/
WITH DEPART_ID_Tree AS
(
SELECT * from TAB_depart where DEPART_ID='4'
UNION ALL
SELECT TAB_DEPART.* from DEPART_ID_Tree
JOIN TAB_DEPART on DEPART_ID_Tree.DEPART_UPID = TAB_DEPART.DEPART_ID
)
SELECT * FROM DEPART_ID_Tree;
输出结果参考:
查找下级
查找上级
更多推荐
已为社区贡献1条内容
所有评论(0)