あなたが一緒に最初にあなたのテーブルを結合した場合:
select mt.id, mt.cust_mobile, mt.type, lt.parent_id
from master_table mt
left join link_table lt on lt.id = mt.id;
ID CUST_MOBIL TYPE PARENT_ID
---------- ---------- ----- ----------
1 9000230003 cust 2
2 8906784566 ret 8
3 7474747474 dist 7
4 4595274646 sdist 5
6 8588775958 cust 3
5 8588585958 fse
8 8588777758 dist
あなたを次いで任意から始まる、インライン・ビューまたはCTEのように、それに対して階層クエリを使用することができ3210エントリ:
with cte (id, cust_mobile, type, parent_id) as (
select mt.id, mt.cust_mobile, mt.type, lt.parent_id
from master_table mt
left join link_table lt on lt.id = mt.id
)
select listagg(id ||','|| cust_mobile ||','|| type, ',')
within group (order by level) as result
from cte
start with type = 'cust'
connect by id = prior parent_id
group by connect_by_root(id);
RESULT
--------------------------------------------------------------------------------
1,9000230003,cust,2,8906784566,ret,8,8588777758,dist
6,8588775958,cust,3,7474747474,dist
これは、各行の関連するデータをコンマで区切られた単一の値に連結します。それらの結合されたエントリのそれぞれは、listagg()
を使用して単一の結果に入れられます。
楽しみのためだけに、あなたも(11gR2のから)再帰CTEを使用することができます。ここで私はちょうどlistagg()
からそれを分離するために、CTE内の最初の連結を移動しました:
with rcte (id, id_mobile_type, root_id, hop) as (
select mt.id, mt.id ||','|| mt.cust_mobile ||','|| mt.type, mt.id, 1
from master_table mt
where mt.type = 'cust' -- starting condition
union all
select mt.id, mt.id ||','|| mt.cust_mobile ||','|| mt.type,
rcte.root_id, rcte.hop + 1
from rcte
join link_table lt on lt.id = rcte.id
join master_table mt on mt.id = lt.parent_id
)
select listagg(id_mobile_type, ',') within group (order by hop) as result
from rcte
group by root_id;
RESULT
--------------------------------------------------------------------------------
1,9000230003,cust,2,8906784566,ret,8,8588777758,dist
6,8588775958,cust,3,7474747474,dist
私は、複数のループと自己加入を使用してそれを行っている、私はあなたがする必要がある –
によって接続するか、レベル使用してそれを実行する必要があり期待される出力をより良く説明する。なぜ結果にあなたが提供したデータがありますか? –
1,9000230003、カスト、8,8588777758、ret6 8588775958カスト、2,8906784566、RET、4,4595274646、sdistの、5,8588585958、FSE –