+---------------+---------+
|Column Name |Type|+---------------+---------+
| employee_id | int || employee_name | varchar || manager_id | int |+---------------+---------+
employee_id is the columnofuniquevaluesfor this table.
Eachrowof this table indicates that the employee with ID employee_id and name employee_name reports his workto his/her direct manager with manager_id
The head of the company is the employee with employee_id =1.
Write a solution to find employee_id of all employees that directly or indirectly report their work to the head of the company.
The indirect relation between managers will not exceed three managers as the company is small.
Input:
Employees table:+-------------+---------------+------------+| employee_id | employee_name | manager_id |+-------------+---------------+------------+|1| Boss |1||3| Alice |3||2| Bob |1||4| Daniel |2||7| Luis |4||8| Jhon |3||9| Angela |8||77| Robert |1|+-------------+---------------+------------+Output:
+-------------+| employee_id |+-------------+|2||77||4||7|+-------------+Explanation:
The head of the company is the employee with employee_id 1.The employees with employee_id 2 and 77 report their work directly to the head of the company.The employee with employee_id 4 reports their work indirectly to the head of the company 4-->2-->1.The employee with employee_id 7 reports their work indirectly to the head of the company 7-->4-->2-->1.The employees with employee_id 3,8, and 9do not report their work to the head of the company directly or indirectly.
The key idea is to use a recursive query to traverse the management hierarchy, starting from employees who directly report to the head (employee_id = 1), and then repeatedly finding employees who report to those employees, up to three levels deep. This way, we can collect all employees who directly or indirectly report to the head.
WITHRECURSIVE ReportChain AS (
-- Step 1: Direct reports to the head
SELECT employee_id, manager_id, 1AS depth
FROM Employees
WHERE manager_id =1AND employee_id !=1UNIONALL-- Step 2: Indirect reports (up to 3 levels)
SELECT e.employee_id, e.manager_id, rc.depth +1FROM Employees e
INNERJOIN ReportChain rc ON e.manager_id = rc.employee_id
WHERE rc.depth <3)
SELECTDISTINCT employee_id
FROM ReportChain;