start with connect bypror再帰調査の使い方

12002 ワード

もっと読む
start with connect bypror再帰調査の使い方
このサブカルは主にBツリー構造タイプのデータ再帰的クエリに用いられ、Bツリー構造タイプのいずれかの接合を与え、最終的な親ノードまたはサブノードを遍歴する。
まず元のデータを見ます。
 1 create table a_test
 2 ( parentid varchar2(10),
 3   subid    varchar2(10));
 4 
 5 insert into a_test values ( '1', '2' );
 6 insert into a_test values ( '1', '3' );
 7 insert into a_test values ( '2', '4' );
 8 insert into a_test values ( '2', '5' );
 9 insert into a_test values ( '3', '6' );
10 insert into a_test values ( '3', '7' );
11 insert into a_test values ( '5', '8' );
12 insert into a_test values ( '5', '9' );
13 insert into a_test values ( '7', '10' );
14 insert into a_test values ( '7', '11' );
15 insert into a_test values ( '10', '12' );
16 insert into a_test values ( '10', '13' );
17 
18 commit;
19 
20 select * from a_test;
 
Bツリーに対応する構造は以下の通りです。
 
 
次に例を見ます。
その中の一つの結点値を与えて、最終的な父の結点を求めます。7を例にしてコードを見てください。
start with子の文:初めの条件を遍歴して、小さい技巧があって、もし父の结点を调べるならば、ここは子结点の列を使うことができて、逆も同じです。
connect byサブ句:接続条件。キーワードpror、prorと親ノード列parentidは一緒に置いて、父の接合方向に遍歴します。prorと子結点列subidを一緒に置くと、葉結点方向に遍歴します。
                         parentid、subidの二列は誰が「=」の前に置いても構いません。大切なのはprorが誰と一緒にいるかです。
order by子文:並べ替え、多く言う必要はありません。
---------------------------------
葉の結点に至る例を見てみましょう。
ここでstart with子文はparentid列を使いました。具体的な違いは後に例を挙げて説明します。
connect by子の句の中で、prorとsubidは同じ側にいて、葉の結点の方向に遍歴しました。7は2つのサブ結点があるので、1級は2つの結果(10と11)、10は2つのサブ結点(12、13)、11はないので、2級は2つの結果(12、13)があります。つまり12,13は葉っぱの結点です。
 
 
 
次にstart with子文の中から異なる列を選択する違いを見ます。
葉の結点を調べる(下へ巡回する)を例にします。
結果は明らかで、本来は7を父として結んで、その子を遍歴して、左図は父の結点列の値をとって、結果はもとの意味に合います。右の図はサブノードの列の値をとっていますが、結果として7の親ノード3が余分に表示されます。
-------------------
where条件の文については、後で検証して記録します。まず疑問を残します