如何解决Oracle Recursive Query Connect By Loop in data
pk1 | event_id | parent_event_id |
---|---|---|
1 | 123 | 123 |
2 | 456 | 123 |
3 | 789 | 456 |
给定上表中的任何特定行,我需要一个返回所有相关行(层次结构上下)的查询。我试图通过抓取所有父行的初始 CTE 表来做到这一点。然后将其用作我的基表并使用递归查询向下导航回到上表(这似乎效率极低,我认为有更好的方法???)。
但是,即使尝试第一步(填充我的 CTE 表)并使用如下查询向上导航也会返回连接错误。
select event_id,level
from myTable
start with pk1 = 2
connect by prior parent_event_id = event_id
我认为这是因为父行是自引用的 (event_id = parent_event_id)?如果我添加 NOCYCLE
语句,则递归会在实际父级之前的行处停止。
两个问题:
1.) 在一个查询中是否有更好的方法来做到这一点?
2.) 知道如何调整上述内容以返回父行吗?
谢谢
解决方法
我不是很清楚您所说的“所有相关行(树上和树下)”是什么意思,但它可能是可能的。
在这里,我在 connect 子句中添加了更多逻辑,以便在树上向上或向下移动。这包括直接父母和后代,但也包括起始节点的兄弟姐妹/表亲。这可能是您想要的,也可能不是。
with mytable as (select 1 as pk1,123 as event_id,123 as parent_event_id from dual
union select 2,456,123 from dual
union select 3,789,456 from dual
union select 4,837,123 from dual)
select pk1,event_id,level,SYS_CONNECT_BY_PATH(event_id,'/') as path
from myTable
start with pk1 = 2
connect by nocycle (prior parent_event_id = event_id and prior event_id <> event_id)
or (prior event_id = parent_event_id)
让根父节点显示的调整只是 and prior event_id <> event_id
- 即,如果父节点 = 当前节点,则不要继续向上爬树。
我添加了一个示例行 (pk1=4) 以显示返回的同级行(不是直接父行或后代行)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。