Oracle递归查询在数据中循环连接

Oracle Recursive Query Connect By Loop in data

我有一个 table 基本上看起来像这样(第一行 pk1=1 是父行)

pk1 event_id parent_event_id
1 123 123
2 456 123
3 789 456

给定上面 table 中的任何特定行,我需要一个 returns 所有相关行(在层次结构中上下)的查询。我试图通过获取所有父行的初始 CTE table 来做到这一点。然后使用它作为我的基础 table 并使用递归查询向下导航回到上面的 table (这似乎非常低效,我认为有更好的方法???)。

但是,甚至尝试第一步(填充我的 CTE table)并使用如下查询向上导航 returns 循环连接错误。

    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 子句中添加了更多逻辑,以便在树上向上或向下。这包括直接父代和后代,还包括 siblings/cousins 到起始节点。这可能是也可能不是你想要的。

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