0

我试过并搜索了下面的问题语句的解决方案,但不幸的是我没有得到确切的输出结果。我需要以下面的格式显示完整的组织层次结构。我试着用UNION ALL使用CTE,但仍然无法获得确切的输出结果。SQL查询/存储过程获取完整的组织层次结构详细信息

表结构:

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

输出:

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 
:,我试图

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… 

代码

enter image description here

+2

好了,告诉我们你的表结构(表名,列名+数据类型),并向我们展示您现在拥有的代码! –

+0

感谢您的关注@marc_s,这是我的表结构....表名称:EMPLOYEEMASTER,--- COLOMNS ------ EMPNAME - > NVARCHAR(50),EMPID-> CHAR(10),MGRID- > CHAR(10), – asp

+1

请**不要**将代码示例或示例数据放入注释 - 因为您无法对其进行格式化,所以**非常难读** ....取而代之:**更新**你的问题通过编辑它来提供额外的信息!谢谢。 –

回答

0

我冒昧地提出基于层次图上的答案:

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; 
+0

非常感谢@lobodava非常感谢,它帮助了我很多:-) – asp