SQL 查询/存储过程以获取完整的组织层次结构详细信息

SQL Query /stored procedure to get complete organization hierarchy detail

我尝试并搜索了以下问题陈述的解决方案,但不幸的是我没有得到准确的输出。我需要以下面的格式显示完整的组织层次结构。我尝试将 CTE 与 UNION ALL 一起使用,但我仍然无法获得准确的输出。

Table结构:

CREATE TABLE EMPMASTER
(
    EMPID CHAR(10),
    EMPNAME NVARCHAR(50),
    EMPDESIG VARCHAR(20),
    MRGID CHAR(10)
);

输出:

EMPNAME     EMPID   EMP DESIGNATION
------------------------------------
EMP1    00001   CEO
EMP2    00009   MANAGER 1
EMP3    00005   TL1
EMP4    00003   SSD1
EMP5    00006   SD1
EMP6    00008   TL2
EMP7    00020   SSD2
EMP8       25   SD2
EMP9    00030   TL3
EMP10   00017   MANAGER2
EMP11   00029   TL4
EMP12   00045   SSD3
EMP13   00060   SSD4
EMP14   00070   SD3
EMP15   00060   SD4
EMP16   00090   SD5
EMP17   00055   SD6
CONTI…  CONTI…  CONTI…

我试过的代码:

WITH HierarchyTree (EMPID, EMPNAME, EMPDESIG, MRGID, Rank)
AS
(
    -- Anchor member definition
    SELECT 
        EMPID, EMPNAME, EMPDESIG, MRGID, 0 AS Rank
    FROM
        EMPMASTER AS e
    WHERE 
        DESIGNATION = 'Admin' AND EMPLOYEE_ID='1'

    UNION ALL

    -- Recursive member definition
    SELECT 
        e.EMPID, e.EMPNAME, e.EMPDESIG, e.MRGID, Rank + 1
    FROM 
        EMPMASTER AS e
    INNER JOIN 
        HierarchyTree AS d ON e.REPORTINGTO = d.EMPLOYEE_ID
)
SELECT 
    EMPID, EMPNAME, DESIGNATION, REPORTINGTO, Rank
FROM 
    HierarchyTree

示例数据

EMPID       EMPNAME     EMPDESIG    MRGID
1            RAM          CEO           0
7326         MOHD RAFI    MANAGER       7454
7454         PMT PHARMA   MANAGER       1
2094         VAC SANJAY   DEVELOPER     14005
602          GS           MANAGER       7454
412          RAJESH       LEAD          602
14005        VAC SM N     LEAD          7326
34395        DEEPAK       LEAD          7326
16430        VIJAY        DEVELOPER     34395

我冒昧地根据层次结构图提出一个答案:

declare @EMPMASTER table
(
    EMPID     CHAR(10)     ,
    EMPNAME   NVARCHAR(50) ,
    EMPDESIG  VARCHAR(20)  ,
    MRGID     CHAR(10)
);

insert into @EMPMASTER values
( '00001', 'EMP1', 'CEO', null ),
    ( '00002', 'EMP2', 'MANAGER1', '00001' ),
        ( '00003', 'EMP3', 'TL1', '00002' ),
            ( '00004', 'EMP4', 'SSD1', '00003' ),
                ( '00005', 'EMP5', 'SD1', '00004' ),
        ( '00006', 'EMP6', 'TL2', '00002' ),
            ( '00007', 'EMP7', 'SSD2', '00006' ),
                ( '00008', 'EMP8', 'SD2', '00007' ),
        ( '00009', 'EMP9', 'TL3', '00002' ),
    ( '00010', 'EMP10', 'MANAGER2', '00001' ),
        ( '00011', 'EMP11', 'TL4', '00010' ),
            ( '00012', 'EMP12', 'SSD3', '00011' ),
            ( '00013', 'EMP13', 'SSD4', '00011' ),
                ( '00014', 'EMP14', 'SD3', '00013' ),
                ( '00015', 'EMP15', 'SD4', '00013' ),
                ( '00016', 'EMP16', 'SD5', '00013' ),
                ( '00017', 'EMP17', 'SD6', '00013' ),
    ( '00018', 'EMP18', 'MANAGER3', '00001' ),
        ( '00019', 'EMP19', 'TL5', '00018' ),
            ( '00020', 'EMP20', 'SSD5', '00019' ),
            ( '00021', 'EMP21', 'SSD6', '00019' ),
                ( '00022', 'EMP22', 'SD7', '00021' ),
                ( '00023', 'EMP23', 'SD8', '00021' ),
        ( '00024', 'EMP24', 'TL6', '00018' ),
            ( '00025', 'EMP25', 'SSD7', '00024' );

with cte as 
(
    select 
        EMPID    ,
        EMPNAME  ,
        EMPDESIG ,
        MRGID    ,
        LEVEL    = 0,
        PATH     = cast(EMPDESIG as varchar(8000))
    from 
        @EMPMASTER
    where
        MRGID is null

    UNION ALL

    select 
        t.EMPID    ,
        t.EMPNAME  ,
        t.EMPDESIG ,
        t.MRGID    ,
        LEVEL      = cte.LEVEL + 1,
        PATH       = cast(cte.PATH + ' > '+ t.EMPDESIG   as varchar(8000))
    from 
        @EMPMASTER t
        inner join cte on cte.EMPID = t.MRGID 
)
select 
    EMPID     ,
    EMPNAME   ,
    EMPDESIG  ,
    MRGID     ,
    LEVEL     ,
    PATH      ,
    HIERARCHY = replicate('     ', LEVEL) + EMPDESIG
from 
    cte 
order by 
    PATH;

相同但提供的数据样本:

declare @EMPMASTER table
(
    EMPID     CHAR(10)     ,
    EMPNAME   NVARCHAR(50) ,
    EMPDESIG  VARCHAR(20)  ,
    MRGID     CHAR(10)
);

insert into @EMPMASTER values
('1'       ,     'RAM'        ,  'CEO'        ,   '0'       ),
('7326'    ,     'MOHD RAFI'  ,  'MANAGER'    ,   '7454'    ),
('7454'    ,     'PMT PHARMA' ,  'MANAGER'    ,   '1'       ),
('2094'    ,     'VAC SANJAY' ,  'DEVELOPER'  ,   '14005'   ),
('602'     ,     'GS'         ,  'MANAGER'    ,   '7454'    ),
('412'     ,     'RAJESH'     ,  'LEAD'       ,   '602'     ),
('14005'   ,     'VAC SM N'   ,  'LEAD'       ,   '7326'    ),
('34395'   ,     'DEEPAK'     ,  'LEAD'       ,   '7326'    ),
('16430'   ,     'VIJAY'      ,  'DEVELOPER'  ,   '34395'   );

with cte as 
(
    select 
        EMPID    ,
        EMPNAME  ,
        EMPDESIG ,
        MRGID    ,
        LEVEL    = 0,
        PATH     = cast(EMPDESIG + ' (' + EMPNAME +')' as varchar(8000))
    from 
        @EMPMASTER
    where
        MRGID = '0'

    UNION ALL

    select 
        t.EMPID    ,
        t.EMPNAME  ,
        t.EMPDESIG ,
        t.MRGID    ,
        LEVEL      = cte.LEVEL + 1,
        PATH       = cast(cte.PATH + ' > ' + t.EMPDESIG + ' (' + t.EMPNAME +')'  as varchar(8000))
    from 
        @EMPMASTER t
        inner join cte on cte.EMPID = t.MRGID 
)
select 
    EMPID     ,
    EMPNAME   ,
    EMPDESIG  ,
    MRGID     ,
    LEVEL     ,
    PATH      ,
    HIERARCHY = replicate('     ', LEVEL) + EMPDESIG + ' (' + EMPNAME +')'
from 
    cte 
order by 
    PATH;