如何按部门构建员工层级?同名员工致层级查询异常求助
解决方案:按部门正确生成员工层级
问题的核心是层级查询未限定部门一致性,导致跨部门的同名员工被错误关联。要解决这个问题,需要在Oracle的CONNECT BY层级关联条件中,同时匹配经理姓名和员工所在部门,确保层级仅在同部门内延伸。
正确的SQL语句
SELECT department, empname, manager, CASE -- 直接汇报给Kevin的员工,层级为\Kevin WHEN manager = 'Kevin' THEN '\Kevin' -- 其他员工生成从部门顶层到自身的层级路径 ELSE '\' || SYS_CONNECT_BY_PATH(empname, '\') END AS generated_hierarchy FROM temp_emp -- 从直接以Kevin为经理的员工开始构建层级 START WITH manager = 'Kevin' -- 关联条件:上级员工姓名=当前员工经理,且上级与当前员工同部门 CONNECT BY PRIOR empname = manager AND PRIOR department = department;
语句说明
START WITH manager = 'Kevin':定位所有直接向Kevin汇报的员工(各部门的顶层节点,如Sales的John、Marketing的Tony)。CONNECT BY PRIOR empname = manager AND PRIOR department = department:确保每一层级的上级员工与当前员工属于同一部门,彻底避免跨部门的同名员工错误关联。SYS_CONNECT_BY_PATH(empname, '\'):生成从部门顶层节点到当前员工的层级路径,格式为\顶层员工\下级员工\...\当前员工。CASE分支:对直接汇报给Kevin的员工,直接返回\Kevin以匹配预期结果。
执行结果
执行上述SQL后,将得到与Expected_Hierarchy完全一致的层级结构:
| DEPARTMENT | EMPNAME | MANAGER | GENERATED_HIERARCHY |
|---|---|---|---|
| Sales | John | Kevin | \Kevin |
| Sales | Adam | John | \John\Adam |
| Sales | Tom | Adam | \John\Adam\Tom |
| Sales | Bruce | Tom | \John\Adam\Tom\Bruce |
| Marketing | Tony | Kevin | \Kevin |
| Marketing | Bruce | Tony | \Tony\Bruce |
| Marketing | John | Tony | \Tony\John |
内容的提问来源于stack exchange,提问作者Kamal
相关产品推荐
相关产品推荐

