历史中的 Oracle 递归查询 table

Oracle Recursive Query in a History table

我想在用户历史记录中进行递归查询Table。我尝试了下面的查询,它只给出了一条记录。由于它是一个历史记录 table 将有多个具有生效日期的特定用户的记录。

 WITH superVis(EMPLID,CH_SUPV_ID) AS ( 
     SELECT A.EMPLID,A.CH_SUPV_ID
     FROM PSOFTUDB.PS_CH_RPTS_TO_TBL A WHERE A.EMPLID = @Param AND A.EFFDT = (select MAX(A2.EFFDT) from PSOFTUDB.PS_CH_RPTS_TO_TBL A2 WHERE A2.EMPLID = A.EMPLID)
     UNION ALL 
     SELECT e.EMPLID,e.CH_SUPV_ID FROM 
     PSOFTUDB.PS_CH_RPTS_TO_TBL e,superVis o where 
     o.CH_SUPV_ID = e.EMPLID 
     ) select * from superVis;

我想要受人尊敬的经理的用户层次结构。我能够在 DB2 中实现这一点。将其更改为 oracle 时出现错误。

当前经理的最新生效日期为查询中要使用的数据。

示例数据:

EMPLID  CH_SUPV_ID EFFDT
1844854 1730352 2020-12-03 00:00:00
1730352 1461958 2018-12-17 00:00:00
1461958 246001  2014-02-04 00:00:00
1461958 954507  2021-06-10 00:00:00
246001  123345  1999-04-12 00:00:00
246001  17139   1999-08-23 00:00:00
246001  18382   2004-04-13 00:00:00
246001  18442   2007-07-27 00:00:00
954507  971510  2019-05-01 00:00:00

预期输出:

EMLID   CH_SUPV_ID EFFDAT
1844854 1730352 2020-12-03 00:00:00
1730352 1461958 2018-12-17 00:00:00
1461958 954507  2021-06-10 00:00:00
954507  971510  2019-05-01 00:00:00

首先,处理生效日期。这就是我在“临时”CTE 中所做的。它显示每个 emplid 的最大有效日期。

完成后,您可以使用 oracle 的分层查询功能轻松获得所需内容。

with temp as (
  select EMPLID, CH_SUPV_ID, EFFDT, max(effdt) over(partition by emplid) maxdate
    from PS_CH_RPTS_TO_TBL
)
select * 
  from temp
connect by nocycle EMPLID = prior CH_SUPV_ID and effdt = maxdate
start with emplid = 1844854