Oracleツリークエリでの他のテーブルの結合
-
02-07-2019 - |
質問
次のような単純な (ID、説明) テーブル t1 があるとします。
id description
-- -----------
1 Alice
2 Bob
3 Carol
4 David
5 Erica
6 Fred
そして、 のような親子関係テーブルt2
parent child
------ -----
1 2
1 3
4 5
5 6
Oracle では、いくつかのカスタム構文拡張を使用して、これをツリーとしてトラバースする方法を提供しています。
select parent, child, sys_connect_by_path(child, '/') as "path"
from t2
connect by prior parent = child
正確な構文は重要ではありません。おそらく上記で間違いを犯したでしょう。重要なことは、上記が次のように見えるものを生み出すということです
parent child path
------ ----- ----
1 2 /1/2
1 3 /1/3
4 5 /4/5
4 6 /4/5/6
5 6 /5/6
私の質問は次のとおりです。sys_connect_by_path() 内で別のテーブル (上記の t1 テーブルなど) を結合して、次のようなものを生成することは可能ですか:
parent child path
------ ----- ----
1 2 /Alice/Bob
1 3 /Alice/Carol
... and so on...
解決
クエリで、T2 を、T1 と T2 を結合し、親、子、および子の説明を返すサブクエリに置き換えます。次に、sys_connect_by_path 関数で、サブクエリの子の説明を参照します。
他のヒント
Mike McAllister のアイデアに基づいて、次では派生テーブルを使用して目的の結果を実現します。
select
T.PARENT
,T.CHILD
,sys_connect_by_path(T.CDESC, '/')
from
(
select
t2.parent as PARENT
,t2.child as CHILD
,t1.description as CDESC
from
t1, t2
where
t2.child = t1.id
) T
where
level > 1 and connect_by_isleaf = 1
connect by prior
T.CHILD = T.PARENT
私の問題では、すべての親が「スーパー親」ルートの下に固定されています。つまり、パスは SYS_CONNECT_BY_PATH で完全に記述できるため、親とパスを連結する cagcowboy の手法が不要になります。
SELECT parent, child, parents.description||sys_connect_by_path(childs.description, '/') AS "path"
FROM T1 parents, T1 childs, T2
WHERE T2.parent = parents.id
AND T2.child = childs.id
CONNECT BY PRIOR parent = child
所属していません StackOverflow