Oracle 甲骨文-得到孩子和祖父母

Oracle 甲骨文-得到孩子和祖父母,oracle,hierarchical-data,Oracle,Hierarchical Data,我需要获取给定节点的子节点,以及属于其最高祖先的字段。我知道如何将两者单独地结合起来,我以后可能会想出如何通过编程将两者结合起来;但我更愿意在一个查询中完成所有操作 假设我的表包含字段id、item_id、code和name,并且item_id为0是根节点,并且我的树如下所示: id item_id code name level ------------------------------------ 1 0 Root 1 2

我需要获取给定节点的子节点,以及属于其最高祖先的字段。我知道如何将两者单独地结合起来,我以后可能会想出如何通过编程将两者结合起来;但我更愿意在一个查询中完成所有操作

假设我的表包含字段id、item_id、code和name,并且item_id为0是根节点,并且我的树如下所示:

id   item_id  code      name    level
------------------------------------
1    0                  Root    1
2    1        my_value  Child1  2
3    2                  Child2  3
我可以使用以下方法获得所需的节点:

select id, item_id, code, name, level from my_table
start with code like '%my_value%'
connect by prior id = item_id
返回:

id   item_id  code      name    level
-------------------------------------
2    1        my_value  Child1  2
3    2                  Child2  3
id   item_id  code      name    level
-------------------------------------
1    0                  Root    1
我还想从这些节点的最高祖先处获取name字段。我可以使用以下方法获取这些节点:

select id, item_id, code, name, level from my_table
where level = (
    select max(level) as max_level from my_table
    start with code like '%my_value%'
    connect by prior item_id = id
)
start with code like '%my_value%'
connect by prior item_id = id
返回:

id   item_id  code      name    level
-------------------------------------
2    1        my_value  Child1  2
3    2                  Child2  3
id   item_id  code      name    level
-------------------------------------
1    0                  Root    1
我想添加从上述查询返回的name字段,作为添加到从第一个查询返回的两个节点的附加字段,即

id   item_id  code      name    root_name   level
------------------------------------------------
2    1        my_value  Child1  Root        2
3    2                  Child2  Root        3

我希望这是清楚的。有什么建议吗?

可能从根目录开始,然后过滤,以限制从“我的值”这样的代码开始

SQL> select id, item_id, code, name, lvl, root_name
  2    from (select id, item_id, code, name, level lvl, sys_connect_by_path(code, '|') c,
  3                connect_by_root name as root_name
  4             from my_table
  5            start with item_id = 0
  6           connect by prior id = item_id)
  7   where c like '%my_value%';

        ID    ITEM_ID CODE                 NAME              LVL ROOT_NAME
---------- ---------- -------------------- ---------- ---------- ----------
         2          1 my_value             Child1              2 Root
         3          2                      Child2              3 Root

太完美了,谢谢你!是时候阅读sys_connect_by_path和connect_by_root了!