1

次のモデルがあるとします。

create table child_parent (
  child number(3),
  parent number(3)
);

次のデータがあるとします。

insert into child_parent values(2,1);
insert into child_parent values(3,1);
insert into child_parent values(4,2);
insert into child_parent values(5,2);
insert into child_parent values(6,3);

次のツリーになります。

        1
       / \
      2   3
     / \   \
    4   5   6

これで、次のように 5 人の親を見つけることができます。

SELECT parent FROM child_parent START WITH  child = 5 
              CONNECT BY NOCYCLE PRIOR parent = child;

しかし、5 から始まるすべてのノード (1、2、3、4、5、6) を取得するにはどうすればよいでしょうか?

4

3 に答える 3

1

Oracle の CONNECT BY 構文は、階層データをトラバースすることを目的としています。これは単方向であるため、双方向性を必要とするグラフの表現には適していません。2 -> 1 -> 35 から始まるすべてのノードを取得するために必要なことは、1 つのクエリで行う方法はありません。


ずいぶん前に、階層内のノードの平坦化 (AKA 推移閉包) に関する質問に答えました1->2->3。すべてのエッジを生成してテーブルに格納する PL/SQL ソリューションを示す論文にリンクしています。この場合、同様のソリューションを使用できます。しかし、明らかに、グラフ内のノードが頻繁に変更されない場合にのみ実用的です。したがって、おそらくそれは限られた用途にすぎません。とにかく、もっと調べてください

于 2013-04-28T13:33:31.173 に答える