【问题标题】:Oracle Recursive Query in a History table历史表中的 Oracle 递归查询
【发布时间】:2021-12-11 16:34:58
【问题描述】:

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

 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

【问题讨论】:

  • 您好,能否提供一些数据给我们进行测试?
  • 嗨,我添加了相同的数据。
  • 希望得到的结果会很好。
  • 我也更新了预期的结果。

标签: sql oracle hierarchy recursive-query


【解决方案1】:

首先,处理生效日期。这就是我在“临时”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  

【讨论】:

  • [代码:1436,SQL 状态:72000] ORA-01436:用户数据中的 CONNECT BY 循环 [脚本位置:2 - 5] - 我运行查询时收到此错误。我运行了第一个给出 maxdate 的查询。但是整个查询给出了错误。
  • @Pradeep 你已经用“oracle”标签标记了这个问题。请标记您真正使用的数据库。是 MSSQL 吗?
  • 是的,我只使用 Oracle。不是 MSSQL。
  • 该死,抱歉,“SQL 状态”部分让我感到困惑。您面临的错误意味着您的数据中存在循环。您只需在测试示例中添加一行“971510 954507”即可轻松模拟它。我已将 NOCYCLE 更新为查询。检查更新的答案
猜你喜欢
  • 2017-05-11
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2013-03-01
  • 1970-01-01
相关资源
最近更新 更多