2

ツリーのような構造に編成された要素を説明する表があります。

ID, PARENT_ID, NAME  
0   null       TOP  
1   0          A  
2   0          B  
3   0          C  
4   1          AA  
5   2          BA 
6   3          CA  
7   6          CAA
...

この階層には多くのレベルがあります。

テーブルからすべての子レコードを取得したい要素のリスト(たとえば、ID 2および3)があるとします。

このようなもの:

select *
from MY_TABLE 
start with PARENT_ID in (2,3)
connect by PARENT_ID = prior ID

戻ります:

ID, PARENT_ID, NAME 
5   2          BA
6   3          CA
7   6          CAA

ただし、出力が次のようになるように、各出力レコードをリスト(2,3)の元の親にマップする必要があります。

ORIGINAL_PARENT_ID, ID, PARENT_ID, NAME 
2                   5   2          BA
3                   6   3          CA
3                   7   6          CAA

どのようにそれを行うことができますか?

4

2 に答える 2

7

connect_by_rootあなたが求めているものかもしれませんか?

SQL> select t.*, connect_by_root parent_id as ORIGINAL_PARENT_ID
  2  from MY_TABLE  t
  3  start with PARENT_ID in (2,3)
  4  connect by PARENT_ID = prior ID
  5  /

        ID  PARENT_ID NAM ORIGINAL_PARENT_ID
---------- ---------- --- ------------------
         5          2 BA                   2
         6          3 CA                   3
         7          6 CAA                  3
于 2013-01-04T16:49:49.317 に答える
0

あなたの名前が実際にあなたのものであると仮定すると、問題はconnect by. 単純な文字列操作を使用できます。

with ToFind (
    select 'C' as parent from dual union all
    select 'B' as parent from dual
   )
select t.*
from t join
     ToFind tf
     on t.name like tf.parent, 100)||'%' and t.name <> tf.parent
于 2013-01-04T16:34:56.943 に答える