返回Employee表 - SQL查询

Dev*_*_29 0 sql sql-server sql-server-2008

请找我的

Emp_Table

Employee    Manager Employee Status
001            001  Active
002            001  Terminate
003            002  Active
004            002  Active
005            004  Terminate
006            005  Terminate
007            006  Active
008            006  Terminate
009            006  Active
Run Code Online (Sandbox Code Playgroud)

我想重新安排上面的表来代表每个员工应该有ACTIVE Manager.
即在我的上表中为员工003 - > 002(经理被终止)因为我需要将此行重新安排到活动管理器,
我需要看到002正按照我的上表002 - > 001经理报告给谁和积极因为我需要更新为003经理是001

请找我的结果表看起来像 - Emp_Reworked_Table

Employee    Manager Employee Status
001            001  Active
002            001  Terminate
003            001  Active
004            001  Active
005            004  Terminate
006            004  Terminate
007            004  Active
008            004  Terminate
009            004  Active
Run Code Online (Sandbox Code Playgroud)

我已经尝试并找到解决方案,但我不知道递归查询为所有员工执行.请帮助

Ava*_*rkx 6

我可能会过度杀死下面的例子,但它的要点是你可能想要使用递归CTE.

IF NOT EXISTS ( SELECT  1
                FROM    sys.objects
                WHERE   name = 'Emp_Table'
                    AND type = 'U' )
BEGIN
    --DROP TABLE dbo.Emp_Table;
    CREATE TABLE dbo.Emp_Table
    (
        EmpTable_PK         TINYINT IDENTITY( 1, 1 ) NOT NULL,
                                PRIMARY KEY ( EmpTable_PK ),
        EmployeeCode        CHAR( 3 ),
        ManagerCode         CHAR( 3 ),
        EmployeeStatus      VARCHAR( 16 )
    );

    INSERT INTO dbo.Emp_Table ( EmployeeCode, ManagerCode, EmployeeStatus )
    SELECT  EmployeeCode, ManagerCode, EmployeeStatus
    FROM (      SELECT  EmployeeCode = NULL, ManagerCode = NULL, EmployeeStatus = NULL
    UNION ALL   SELECT  '001', '001', 'Active'
    UNION ALL   SELECT  '002', '001', 'Terminate'
    UNION ALL   SELECT  '003', '002', 'Active'
    UNION ALL   SELECT  '004', '002', 'Active'
    UNION ALL   SELECT  '005', '004', 'Terminate'
    UNION ALL   SELECT  '006', '005', 'Terminate'
    UNION ALL   SELECT  '007', '006', 'Active'
    UNION ALL   SELECT  '008', '006', 'Terminate'
    UNION ALL   SELECT  '009', '006', 'Active' ) l
    WHERE   l.EmployeeCode IS NOT NULL
END;
GO

;WITH cte_Hierarchy AS (
    SELECT  et.EmpTable_PK, et.EmployeeCode, 
            et.ManagerCode, et.EmployeeStatus, 
            ManagerStatus = mt.EmployeeStatus
    FROM    dbo.Emp_Table et
    INNER JOIN dbo.Emp_Table mt
        ON  et.ManagerCode = mt.EmployeeCode
    UNION ALL
    SELECT  h.EmpTable_PK, h.EmployeeCode,
            ManagerCode = et.ManagerCode, 
            h.EmployeeStatus,
            mt.EmployeeStatus
    FROM    cte_Hierarchy h
    INNER JOIN dbo.Emp_Table et
        ON  h.ManagerCode = et.EmployeeCode
    INNER JOIN dbo.Emp_Table mt
        ON  et.ManagerCode = mt.EmployeeCode
    WHERE   h.ManagerStatus = 'Terminate'
        AND et.EmployeeCode <> et.ManagerCode )
SELECT  EmployeeCode, ManagerCode, EmployeeStatus
FROM    cte_Hierarchy
WHERE   ManagerStatus = 'Active'
ORDER BY EmpTable_PK, EmployeeCode, ManagerCode;
Run Code Online (Sandbox Code Playgroud)