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;
我尝试并搜索了以下问题陈述的解决方案,但不幸的是我没有得到准确的输出。我需要以下面的格式显示完整的组织层次结构。我尝试将 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;