Oracle:层次查询连接依据

问题描述 投票:2回答:2

我写了一个Oracle分层查询,它将为我们提供特定员工的高级管理人员。

例如如果我们有示例Emp和Manager映射,如:

WITH emp_manager_mapping AS (
 select 'A' empId, 'B' managerId,sysdate-100 appliedOn,'Success' status from dual
 union all
 select 'C' empId, 'D' managerId, sysdate-70 appliedOn, 'Success' status from dual
  union all
 select 'B' empId, 'C' managerId, sysdate-50 appliedOn,'Success' status from dual
 )select * from emp_manager_mapping; 

输出为:

A   B   10-SEP-19   Success
C   D   10-OCT-19   Success
B   C   30-OCT-19   Success

[之后,我们对该数据集应用分层查询,然后查找谁是雇员ID为“ A”的最高管理者:

WITH emp_manager_mapping AS (
 select 'A' empId, 'B' managerId,sysdate-100 appliedOn,'Success' status from dual
 union all
 select 'C' empId, 'D' managerId, sysdate-70 appliedOn, 'Success' status from dual
  union all
 select 'B' empId, 'C' managerId, sysdate-50 appliedOn,' Success' status from dual
 ) SELECT
    CONNECT_BY_ROOT ( empid ) AS empid,
    CONNECT_BY_ROOT ( managerid ) AS managerid,
    managerid AS top_manager_id,
    level
FROM
    emp_manager_mapping
WHERE
    CONNECT_BY_ISLEAF = 1 and status = 'Success'
START WITH
    empid = 'A'
CONNECT BY NOCYCLE
    PRIOR managerid = empid;

比输出为:

Value of top_manager_id is D

根据查询,它提供查询但不提供申请日期,如果我们还考虑了最晚的申请日期,则必须忽略

C   D   10-OCT-19   Success record.

并且我希望最终输出的top_manager id应该是“ C”

任何人都可以帮助找到预期的结果吗?

sql oracle hierarchy connect-by
2个回答
0
投票

并且我希望最终输出的top_manager id应该为“ C”

为什么?因为C-D关系是appliedOn日期早于B-> C关系?

如果是,这是您要寻找的吗?

WITH emp_manager_mapping AS (
 select 'A' empId, 'B' managerId,sysdate-100 appliedOn,'Success' status from dual
 union all
 select 'C' empId, 'D' managerId, sysdate-70 appliedOn, 'Success' status from dual
  union all
 select 'B' empId, 'C' managerId, sysdate-50 appliedOn,'Success' status from dual
 ) SELECT
    CONNECT_BY_ROOT ( empid ) AS empid,
    CONNECT_BY_ROOT ( managerid ) AS managerid,
    managerid AS top_manager_id,
    level
FROM
    emp_manager_mapping
WHERE
    CONNECT_BY_ISLEAF = 1
START WITH
    empid = 'A'
CONNECT BY NOCYCLE
    empid  = PRIOR managerid
    AND appliedOn >= PRIOR appliedOn
    AND status = 'Success'
    ;
+-------+-----------+----------------+-------+
| EMPID | MANAGERID | TOP_MANAGER_ID | LEVEL |
+-------+-----------+----------------+-------+
| A     | B         | C              |     2 |
+-------+-----------+----------------+-------+

[另外,请注意我将status='Success'的支票移到了CONNECT BY。根据您的要求,这可能是对还是错。但我想指出这一点,因为如果叶子行不是“成功”,则拥有WHERE子句会使查询获得零行(因为WHERE子句的评估是[[after [ C0])。


0
投票
查找层次结构中的所有行,然后按CONNECT BY排序这些行,并仅保留最新的行:

查询:

appliedOn

输出

TOP_MANAGERID |深度| EMPID |管理者:------------ | ----:| :---- | :--------C | 2 | A |乙

db <>小提琴WITH emp_manager_mapping ( empid, managerid, appliedon, status ) AS ( select 'A', 'B', sysdate-100,'Success' from dual union all select 'C', 'D', sysdate-70, 'Success' from dual union all select 'B', 'C', sysdate-50, 'Success' from dual ) SELECT managerid AS top_managerid, LEVEL AS depth, CONNECT_BY_ROOT ( empid ) AS empid, CONNECT_BY_ROOT ( managerid ) AS managerid FROM emp_manager_mapping e WHERE status = 'Success' START WITH empid = 'A' CONNECT BY NOCYCLE PRIOR managerid = empid ORDER BY AppliedOn DESC FETCH FIRST ROW ONLY;

© www.soinside.com 2019 - 2024. All rights reserved.