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