I have 2 tables : T_Employees and T_Projects
Every project has different number of employees assigned. What i need to do, is to get hierarchical structure of each employ
You can travers a hierarchy with a recursive CTE
This is the classical top down CTE:
WITH EmployeesHierarchy AS
(
SELECT ID,[Level],Employee,Department,Code,MasterId
FROM T_Employees
WHERE [Level]=1
UNION ALL
SELECT nextLevel.ID,nextLevel.[Level],nextLevel.Employee,nextLevel.Department,nextLevel.Code,nextLevel.MasterId
FROM EmployeesHierarchy AS recCall
INNER JOIN T_Employees AS nextLevel ON nextLevel.[Level]=recCall.[Level]+1 AND nextLevel.MasterId=recCall.ID
)
SELECT * FROM EmployeesHierarchy
ORDER BY [Level],MasterId
GO
And now the other way round: I start with the employees mentioned in the project and move up the list until there is no parentId any more. The Project's data gotten in the first part of the CTE are just passed through to show up in all rows.
WITH EmployeesHierarchy AS
(
SELECT p.ID AS p_ID,p.ProjectId,e.ID AS e_ID,[Level],e.Employee,e.Department,e.Code,e.MasterId
FROM T_Projects AS p
INNER JOIN T_Employees AS e ON p.EmployeeId=e.ID
UNION ALL
SELECT recCall.p_ID,recCall.ProjectId,nextLevel.ID,nextLevel.[Level],nextLevel.Employee,nextLevel.Department,nextLevel.Code,nextLevel.MasterId
FROM EmployeesHierarchy AS recCall
INNER JOIN T_Employees AS nextLevel ON nextLevel.ID=recCall.MasterId
)
SELECT * FROM EmployeesHierarchy
--WHERE ProjectId=456
ORDER BY [Level]
The result
+------+-----------+------+-------+------------+------------+------+----------+
| p_ID | ProjectId | e_ID | Level | Employee | Department | Code | MasterId |
+------+-----------+------+-------+------------+------------+------+----------+
| 3 | 23 | 1 | 1 | Thomas S. | A | 1-4 | NULL |
+------+-----------+------+-------+------------+------------+------+----------+
| 2 | 456 | 3 | 1 | Simone S. | A | 1-3 | NULL |
+------+-----------+------+-------+------------+------------+------+----------+
| 1 | 456 | 1 | 1 | Thomas S. | A | 1-4 | NULL |
+------+-----------+------+-------+------------+------------+------+----------+
| 2 | 456 | 6 | 2 | Loris P. | B | 2-15 | 3 |
+------+-----------+------+-------+------------+------------+------+----------+
| 1 | 456 | 4 | 2 | Stefan K. | B | 2-18 | 1 |
+------+-----------+------+-------+------------+------------+------+----------+
| 3 | 23 | 4 | 2 | Stefan K. | B | 2-18 | 1 |
+------+-----------+------+-------+------------+------------+------+----------+
| 3 | 23 | 7 | 3 | Lennon I. | B | 2-19 | 4 |
+------+-----------+------+-------+------------+------------+------+----------+
| 1 | 456 | 8 | 3 | Kerim K. | C | 2-66 | 4 |
+------+-----------+------+-------+------------+------------+------+----------+
| 2 | 456 | 9 | 3 | Ilmas Y. | C | 2-59 | 6 |
+------+-----------+------+-------+------------+------------+------+----------+
| 1 | 456 | 10 | 4 | Innes Y. | D | 3-89 | 8 |
+------+-----------+------+-------+------------+------------+------+----------+
| 2 | 456 | 12 | 4 | Fatih O. | I | 3-32 | 9 |
+------+-----------+------+-------+------------+------------+------+----------+
| 3 | 23 | 11 | 4 | Andreas U. | E | 3-63 | 7 |
+------+-----------+------+-------+------------+------------+------+----------+