員工表自關聯 (EMPLOYEE_ID / MANAGER_ID),層級不固定。需求:統計每位主管「本人 + 所有下屬 (遞歸)」的薪資總和。CEO 總和 = 全公司薪資。
語法:CONNECT_BY_ROOT column_name
START WITH 指定根節點時,所有行返回同一根值。GROUP BY root_column 即得各節點匯總。
SELECT last_name "Employee",
CONNECT_BY_ROOT last_name "Manager",
LEVEL-1 "Pathlen",
SYS_CONNECT_BY_PATH(last_name, '/') "Path"
FROM employees
WHERE LEVEL > 1 AND department_id = 110
CONNECT BY PRIOR employee_id = manager_id
ORDER BY "Employee", "Manager", "Pathlen", "Path";
結果:每位員工對應其所有上級 (含間接),路徑如 /King/Kochhar/Higgins/Gietz。
SELECT name, SUM(salary) "Total_Salary"
FROM (
SELECT CONNECT_BY_ROOT last_name AS name, salary
FROM employees
WHERE department_id = 110
CONNECT BY PRIOR employee_id = manager_id
)
GROUP BY name
ORDER BY name, "Total_Salary";
結果:
| NAME | Total_Salary |
|---|---|
| Gietz | 8300 |
| Higgins | 20300 |
| King | 20300 |
| Kochhar | 20300 |
解讀: King/Kochhar/Higgins 總和相同 (20300) = 部門 110 全員薪資;Gietz 為葉節點僅含自身薪資。
| 子句/函數 | 角色 |
|---|---|
| CONNECT BY PRIOR employee_id = manager_id | 定義父子關係 (自關聯) |
| CONNECT_BY_ROOT last_name | 標記每行所屬的根節點 (主管) |
| GROUP BY name | 按根節點聚合 |
| SYS_CONNECT_BY_PATH(col, '/') | 生成從根到當前節點的路徑字串 |
| LEVEL | 當前節點深度 (根為 1) |
CONNECT_BY_ISLEAF 識別葉節點、CONNECT_BY_ISCYCLE 偵測循環引用。MANAGER_ID 上建立索引。DBMS_HIERARCHY 維護。