首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 階層查詢實現組織架構薪資匯總:CONNECT_BY_ROOT 與 SYS_CONNECT_BY_PATH 進階應用

     編輯:Oracle 資料庫基礎

業務場景:動態組織樹的遞歸匯總

員工表自關聯 (EMPLOYEE_ID / MANAGER_ID),層級不固定。需求:統計每位主管「本人 + 所有下屬 (遞歸)」的薪資總和。CEO 總和 = 全公司薪資。

核心函數:CONNECT_BY_ROOT

語法:CONNECT_BY_ROOT column_name

  • 返回當前行在階層樹中的根節點對應欄位值。
  • 搭配 START WITH 指定根節點時,所有行返回同一根值。
  • 不指定 START WITH 時,Oracle 依序以每個節點為根進行遍歷 → 配合 GROUP BY root_column 即得各節點匯總。

官方範例深度解析

範例 1:顯示員工、所有上級主管、層級深度與路徑


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。

範例 2:各主管含下屬薪資總和 (核心需求)


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";

結果:

NAMETotal_Salary
Gietz8300
Higgins20300
King20300
Kochhar20300

解讀: 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)

擴展應用場景

  • 組織架構下的預算分銷、權限繼承、KPI 滾動彙總。
  • 物料清單 (BOM) 成本遞歸計算。
  • 地理區域銷售層級彙總 (國 → 省 → 市 → 區)。
  • 搭配 CONNECT_BY_ISLEAF 識別葉節點、CONNECT_BY_ISCYCLE 偵測循環引用。

效能提示

  • 大型階層表建議在 MANAGER_ID 上建立索引。
  • 避免在階層查詢中使用成本高的 PL/SQL 函數。
  • 超大樹結構考慮物化視圖預計算或 DBMS_HIERARCHY 維護。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved