1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| DECLARE @Employees TABLE (EmpID INT, EmpName VARCHAR(20), ReportsTo INT)
INSERT INTO @Employees(EmpID, EmpName, ReportsTo)
SELECT 1, 'Jacob', NULL UNION ALL
SELECT 2, 'Rui', NULL UNION ALL
SELECT 3, 'Jacobson', NULL UNION ALL
SELECT 4, 'Jess', 1 UNION ALL
SELECT 5, 'Steve', 1 UNION ALL
SELECT 6, 'Bob', 1 UNION ALL
SELECT 7, 'Smith', 2 UNION ALL
SELECT 8, 'Bobbey', 2 UNION ALL
SELECT 9, 'Steffi', 3 UNION ALL
SELECT 10, 'Bracha', 3 UNION ALL
SELECT 11, 'John', 5 UNION ALL
SELECT 12, 'Michael', 6 UNION ALL
SELECT 13, 'Paul', 6 UNION ALL
SELECT 14, 'Lana', 7 UNION ALL
SELECT 15, 'Johnson', 7 UNION ALL
SELECT 16, 'Mic', 8 UNION ALL
SELECT 17, 'Stev', 8 UNION ALL
SELECT 18, 'Paulson', 9 UNION ALL
SELECT 19, 'Jessica', 10
DECLARE @manager VARCHAR(20)
SELECT @manager = 'Jacob';
WITH cte_employees (EmpID,EmpNameBrut,EmpName,level,path_,sort)
AS
(
SELECT
EmpID,
EmpName,
CAST(EmpName AS VARCHAR(200)),
0,
CAST('|' AS VARCHAR(MAX)),
CAST(EmpID AS VARCHAR(200))
FROM @Employees emp
WHERE ReportsTo IS NULL
UNION ALL
SELECT
emp.EmpID,
emp.EmpName,
CAST(SPACE(4 * (cte.level + 1)) + emp.EmpName AS VARCHAR(200)),
cte.level + 1,
cte.path_ + CAST(emp.ReportsTo AS VARCHAR(MAX)) + '|',
CAST(sort + '|' + CAST(emp.EmpID AS VARCHAR(2)) AS VARCHAR(200))
FROM @Employees emp
INNER JOIN cte_employees cte
ON emp.ReportsTo = cte.EmpID
)
SELECT
emp1.EmpName
FROM cte_employees emp1
WHERE CHARINDEX('|' + (SELECT CAST(emp3.EmpID AS VARCHAR(2))
FROM cte_employees emp3
WHERE emp3.EmpNameBrut = @Manager) + '|',path_) <> 0
OR emp1.EmpID = (SELECT emp2.EmpID
FROM cte_employees emp2
WHERE emp2.EmpNameBrut = @Manager)
ORDER BY sort; |
Partager