涉及三个表格。 DBMS是Oracle 10g。
员工=个人员工记录
部门=包含分层组织结构
协会=将员工映射到部门
如果协会将员工映射到不同深度的部门,我想运行一个查询,计算深度为2的所有员工。如果员工在6级部门工作,我需要解决5级,然后等级4,然后等级3到达等级2,但如果他们在等级3的部门工作,我只需要解决等级2。
试图找出最有效的方法。到目前为止,我正在考虑运行5个单独的查询,每个深度使用不同数量的子查询来解析深度级别,然后与union结合使用。我的第二个想法是创建一个静态引用表来将每个部门代码映射到2级标签,但保持该表会有问题。
有人有更好的想法吗?
答案 0 :(得分:1)
递归CTE节省了一天。如果我的问题不清楚,我很抱歉,这是我的解决方案,尽管我可能已经改变了原帖中的一些字段名称。我计划在union查询的第一部分中用U.ID的静态值替换任何部门代码并检索其各自的下级部门的参数。
在这种情况下,dept代码' 5000002'是IT部门,结果显示IT部门层次结构的各个级别的所有员工。
select r.full_name, r.id, u.dept_name, u.dept_id, u.dept_level
from clarity.srm_resources r,
clarity.PRJ_OBS_ASSOCIATIONS a,
(with DIRECT_DEPT (Parent_ID, Dept_ID, Dept_Name, Dept_Level)
as
(
SELECT U.PARENT_ID, U.ID AS DEPT_ID, U.NAME AS DEPT_NAME, 0 AS Dept_Level
FROM clarity.prj_obs_units u
where u.type_id = '5000001'
AND U.ID = '5000002'
UNION ALL
SELECT U.PARENT_ID, U.ID AS DEPT_ID, U.NAME AS DEPT_NAME, Dept_Level +1
FROM clarity.prj_obs_units u
INNER JOIN DIRECT_DEPT D
ON U.PARENT_ID = D.DEPT_ID
where u.type_id = '5000001'
)
SELECT Parent_ID, Dept_ID, Dept_Name, Dept_Level
FROM DIRECT_DEPT) u
where a.record_id = r.id
and a.unit_id = u.dept_id
and a.table_name ='SRM_RESOURCES'
and r.is_active = '1'
;