質問

次のような単純な (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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top