一.前言

        假设有下面这张表,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;

       输出结果参考:

       查找下级

       

      查找上级

      

Logo

更多推荐