SQL 递归查询以查找缺少级别的经理下属
SQL Recursive Query to find subordinates under a manager with missing levels
考虑以下 Associate
table:
Id | Name | ManagerId
---+-------+------------
1 | A | Null
2 | B | 1
3 | C | 2
4 | D | 3
5 | E | 3
6 | F | 3
这里有一位 CEO (A)、一位经理 (B)、一位团队负责人 (C) 和团队成员 (D、E、F)。
另一个 table 注册包含已注册保险的员工:
Id | Number of Family Members
---+--------------------------
3 | 3
4 | 2
6 | 2
我需要递归查询获取CEO下所有注册的员工,前提是部分下属还没有注册。
根据您的输入,查询为。
; WITH recursive_CTE (id,name,MANAGERID,CEONAME,CEO)
AS(
SELECT ID,name,MANAGERID,name ,ID FROM ASSOSIATETABLE WHERE MANAGERID IS NULL
UNION ALL
SELECT B.ID,B.name,B.MANAGERID,A.CEONAME,A.CEO FROM recursive_CTE A
INNER JOIN ASSOSIATETABLE B ON A.ID=B.ManagerID
)
SELECT * FROM recursive_CTE
WHERE ID NOT IN (SELECT ID FROM Registration )
AND MANAGERID IS NOT NULL
结果中需要CEO,请去掉"AND MANAGERID IS NOT NULL"
Declare @Employee TABLE
(
id INT,
name VARCHAR(50) NOT NULL,
ManagerId Varchar(50) NULL
)
Declare @Registration TABLE
(
id INT,
No_of_FamilyMember Int
)
INSERT INTO @Employee
VALUES
(1, 'CEO (A)', NULL),
(2, 'Manager (B)', 1),
(3, 'Team lead (C)', 2),
(4, 'Team members(D)', 3),
(5, 'Team members(E)', 3),
(6, 'Team members(F)', 3)
INSERT INTO @Registration
VALUES
(3, 3),
(4, 2),
(6,2)
--SELECT * FROM @Employee
;WITH EMP_CTE AS
(
SELECT Id, Name, ManagerId, CAST('' AS VARCHAR(50)) ManagerName, 0 AS EmployeeLevel FROM @Employee WHERE ManagerId IS NULL
UNION ALL
SELECT T.Id,T.Name, T.ManagerId,CAST(C.name AS VARCHAR(50)) ManagerName, EmployeeLevel + 1 AS EmployeeLevel FROM @Employee AS T
INNER JOIN EMP_CTE AS C ON C.[![enter image description here][1]][1]id=T.ManagerId
)
SELECT E.Id,Name, ManagerId, ManagerName, EmployeeLevel,
case when No_of_FamilyMember is null then 'Not Registered' else cast(No_of_FamilyMember as Varchar) end FamilyMemebers
FROM EMP_CTE E left join @Registration R on E.id = R.id
考虑以下 Associate
table:
Id | Name | ManagerId
---+-------+------------
1 | A | Null
2 | B | 1
3 | C | 2
4 | D | 3
5 | E | 3
6 | F | 3
这里有一位 CEO (A)、一位经理 (B)、一位团队负责人 (C) 和团队成员 (D、E、F)。
另一个 table 注册包含已注册保险的员工:
Id | Number of Family Members
---+--------------------------
3 | 3
4 | 2
6 | 2
我需要递归查询获取CEO下所有注册的员工,前提是部分下属还没有注册。
根据您的输入,查询为。
; WITH recursive_CTE (id,name,MANAGERID,CEONAME,CEO)
AS(
SELECT ID,name,MANAGERID,name ,ID FROM ASSOSIATETABLE WHERE MANAGERID IS NULL
UNION ALL
SELECT B.ID,B.name,B.MANAGERID,A.CEONAME,A.CEO FROM recursive_CTE A
INNER JOIN ASSOSIATETABLE B ON A.ID=B.ManagerID
)
SELECT * FROM recursive_CTE
WHERE ID NOT IN (SELECT ID FROM Registration )
AND MANAGERID IS NOT NULL
结果中需要CEO,请去掉"AND MANAGERID IS NOT NULL"
Declare @Employee TABLE
(
id INT,
name VARCHAR(50) NOT NULL,
ManagerId Varchar(50) NULL
)
Declare @Registration TABLE
(
id INT,
No_of_FamilyMember Int
)
INSERT INTO @Employee
VALUES
(1, 'CEO (A)', NULL),
(2, 'Manager (B)', 1),
(3, 'Team lead (C)', 2),
(4, 'Team members(D)', 3),
(5, 'Team members(E)', 3),
(6, 'Team members(F)', 3)
INSERT INTO @Registration
VALUES
(3, 3),
(4, 2),
(6,2)
--SELECT * FROM @Employee
;WITH EMP_CTE AS
(
SELECT Id, Name, ManagerId, CAST('' AS VARCHAR(50)) ManagerName, 0 AS EmployeeLevel FROM @Employee WHERE ManagerId IS NULL
UNION ALL
SELECT T.Id,T.Name, T.ManagerId,CAST(C.name AS VARCHAR(50)) ManagerName, EmployeeLevel + 1 AS EmployeeLevel FROM @Employee AS T
INNER JOIN EMP_CTE AS C ON C.[![enter image description here][1]][1]id=T.ManagerId
)
SELECT E.Id,Name, ManagerId, ManagerName, EmployeeLevel,
case when No_of_FamilyMember is null then 'Not Registered' else cast(No_of_FamilyMember as Varchar) end FamilyMemebers
FROM EMP_CTE E left join @Registration R on E.id = R.id