1

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

假设我的表包含字段 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

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

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

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

4

1 回答 1

2

也许从根开始,然后过滤以限制以 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
于 2012-11-09T18:06:06.163 回答