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) 以显示返回的同级行(不是直接父行或后代行)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...