1

我有一个包含这样行的表:

    ID        Parent_ID   Name
    1         (null)      A
    2         1           B
    3         1           C
    4         2           D
    5         3           E
    6         5           F
    7         (null)      G
    8         (null)      H

无论是否将 Name='A' 或 'F' 作为标准传递,我都需要获取所有相关行的 ID。在这种情况下,我应该收到除 7 和 8 之外的所有 ID。

我尝试了很多例子并阅读了很多文章,但我现在放弃了。你能帮忙吗?

4

2 回答 2

0

A位于层次结构的根部(它是 的父级B,是 的父级D,等等)。从开始A并开始工作F(也一直到Dand E,它们也A通过不同的路线作为父母):

SELECT ID, Parent_ID, Name
FROM tbl
START WITH Name = 'A'
CONNECT BY PRIOR ID = Parent_ID

F位于层次结构的末尾。甲骨文称其为“叶子”。从叶子开始,F一直到A顶部:

SELECT ID, Parent_ID, Name
FROM tbl
START WITH Name = 'F' -- start with F instead of A
CONNECT BY PRIOR Parent_ID = ID -- switch the CONNECT BY to work up

Oracle 有一个SYS_CONNECT_BY_PATH非常适合可视化层次结构的功能。以下是如何在第一个查询中使用它(A向下F):

SELECT ID, Parent_ID, Name, SYS_CONNECT_BY_PATH(Name, '/') AS Path
FROM tbl
START WITH Name = 'A'
CONNECT BY PRIOR ID = Parent_ID

结果:

  ID  PARENT_ID NAME PATH
---- ---------- ---- -----------
   1            A    /A
   2          1 B    /A/B
   4          2 D    /A/B/D
   3          1 C    /A/C
   5          3 E    /A/C/E
   6          5 F    /A/C/E/F

您可以使用任何您想要的分隔符作为SYS_CONNECT_BY_PATH.

于 2013-04-25T18:17:09.403 回答
0
with
   t as (
      select id
      from your_table
      where name = 'D'  -- your starting point
   )
select id
from (
   select id, parent_id from your_table
   where parent_id is not null
   union all
   select parent_id, id from your_table
   where parent_id is not null
   union all
   select id, null from t
)
start with parent_id is null
connect by nocycle prior id = parent_id

小提琴

于 2013-04-25T18:22:58.147 回答