从各个方向的自引用表中获取数据

时间:2013-04-25 17:58:50

标签: sql oracle self-reference

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

    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。

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

2 个答案:

答案 0 :(得分:0)

A位于层次结构的根目录(它是B的父级,它是D的父级,等等。从A开始,一直向下F(以及DE,其中A作为父母通过不同的路线):

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

F位于层次结构的末尾。 Oracle称之为“叶子”。从叶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的第二个参数。

答案 1 :(得分: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

fiddle