微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle Recursive Query Connect By Loop in data

如何解决Oracle Recursive Query Connect By Loop in data

我有一个基本上是这样的表(第一行 pk1=1 是父行)

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?