8

次のような単純な (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

私の質問はこれです: 上記の t1 テーブルなど、sys_connect_by_path() 内の別のテーブルに参加して、次のようなものを生成することは可能ですか?

parent  child  path
------  -----  ----
1       2      /Alice/Bob
1       3      /Alice/Carol
... and so on...
4

3 に答える 3

7

クエリで、T2 を T1 と T2 を結合するサブクエリに置き換え、親、子、および子の説明を返します。次に、sys_connect_by_path 関数で、サブクエリから子の説明を参照します。

于 2008-09-22T20:53:44.987 に答える
6

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 の手法が不要になります。

于 2008-09-23T08:01:14.460 に答える
0
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
于 2008-09-22T20:56:21.970 に答える