一.前言

        假设有下面这张表,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;
       输出结果参考:

       查找下级

       

      查找上级

      

技术
©2019-2020 Toolsou All rights reserved,
hive大量小文件处理方法总结最优化方法总结:公式解、数值优化、求解思想JavaScript中的 Call 和 Apply内存溢出和内存泄漏的区别、产生原因以及解决方案创建数据mysql库流程微信小程序(uni-app)url参数传递对象蝗灾虫群上亿只很少发生碰撞 蝗虫要成自动驾驶功臣vue 监听 Treeselect 选择项的改变第十一届蓝桥杯C/C++ 大学 B 组大赛软件类省赛服务器价格有什么差异?