【问题标题】:SQL Query /stored procedure to get complete organization hierarchy detailSQL 查询/存储过程以获取完整的组织层次结构详细信息
【发布时间】:2015-11-08 10:43:58
【问题描述】:

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

表结构:

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

【问题讨论】:

  • 好吧,给我们看看你的表结构(表名、列名+数据类型),然后给我们看看你现在拥有的代码!
  • 感谢您的关注@marc_s,这是我的表结构 ....TABLE NAME :EMPLOYEEMASTER,--- COLOMNS ------ EMPNAME ->NVARCHAR(50),EMPID-> CHAR(10),MGRID->CHAR(10),
  • 不要将代码示例或示例数据放入 cmets - 因为您无法对其进行格式化,所以阅读它非常困难....而是:更新您的问题,编辑它以提供附加信息!谢谢。
  • Marc_s ..请完成需要..
  • 是的,到目前为止,您尝试过哪些 SQL 代码?我们将帮助您解决任何问题,但我们不仅仅是一个代码编写服务,只是为您编写所有内容.....

标签: sql-server-2008 tsql stored-procedures common-table-expression


【解决方案1】:

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

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;

【讨论】:

  • 非常感谢@lobodava 非常感谢你,它帮助了我很多:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
相关资源
最近更新 更多