在递归子查询分解中,需要标识根employee_id并在最终查询中使用它,如下所示:
WITH your_table AS
(SELECT 1 employee_id, 10 manager_id FROM dual UNION ALL
SELECT 10 employee_id, 20 manager_id FROM dual UNION ALL
SELECT 20 employee_id, NULL manager_id FROM dual UNION ALL
SELECT 2 employee_id, 5 manager_id FROM dual UNION ALL
SELECT 5 employee_id, 7 manager_id FROM dual UNION ALL
SELECT 7 employee_id, NULL manager_id FROM dual UNION ALL
SELECT 3 employee_id, 6 manager_id FROM dual UNION ALL
SELECT 6 employee_id, NULL manager_id FROM dual),
recursive(employee_id,
manager_id,
root_emp_id) AS
(SELECT employee_id,
manager_id,
employee_id root_emp_id
FROM your_table
WHERE manager_id IS NOT NULL
UNION ALL
SELECT yt.employee_id,
yt.manager_id,
r.root_emp_id
FROM recursive r
INNER JOIN your_table yt
ON r.manager_id = yt.employee_id)
SELECT root_emp_id employee_id,
employee_id ultimate_manager_id
FROM recursive
WHERE manager_id IS NULL
ORDER BY employee_id;
EMPLOYEE_ID ULTIMATE_MANAGER_ID
----------- -------------------
1 20
2 7
3 6
5 7
10 20
这模拟了“按分层查询连接”中的“按根连接”函数。