历史中的 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
我想在用户历史记录中进行递归查询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