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)
我已经尝试并找到解决方案,但我不知道递归查询为所有员工执行.请帮助
我可能会过度杀死下面的例子,但它的要点是你可能想要使用递归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)
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |