1

最上位の祖先に属するフィールドとともに、特定のノードの子を取得する必要があります。私は両方を個別に取得する方法を知っています。おそらく、後で2つをプログラムで組み合わせる方法を理解できるでしょう。しかし、私はそれをすべて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

上記のクエリから返された名前フィールドを、最初のクエリから返された 2 つのノードに追加される追加フィールドとして追加したいと思います。

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 に答える