甲骨文 - 让孩子和祖父母都来

时间:2012-11-09 16:50:30

标签: oracle hierarchical-data

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

假设我的表包含字段id,item_id,代码和名称,并且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

我还希望从这些节点的最高祖先获取名称字段。我可以使用以下方法获取这些节点:

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
-------------------------------------
1    0                  Root    1

我想添加从上面的查询返回的名称字段作为添加到第一个查询返回的两个节点的附加字段,即

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

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

1 个答案:

答案 0 :(得分:2)

也许从root开始,然后过滤以限制从像my_value这样的代码开始?

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