私はテーブルを持っています、SELECT * FROM data
id pred name visual link, for your convenience
--------------------
1 null One
20 null Two <--+
21 20 Three -^
30 null Four <--+
31 30 Five -^ <--+
32 31 Six -^
行は、列を介してpred
列に接続されていid
ます。それらはチェーンのみを形成し、ツリーは形成しません。各ノードには、1 つまたは 0 つの後続ノードしかありません (重要な場合)。
init
チェーンの最初の要素が表示されるクエリに列を追加したい、つまり
id pred name init initname
---------------------------------
1 null One 1 One
20 null Two 20 Two
21 20 Three 20 Two
30 null Four 30 Four
31 30 Five 30 Four
32 31 Six 30 Four
pred=null
の行も表示null
されれば問題ありませんinit
。- この
initname
列は完全にオプションです。ここではデモンストレーションのためにのみ示します。必要なのはid
.
節について収集したconnect by
ことから、「ルート」ごとにその「子」ノードがリストされているという、やや逆の結果を管理しました。「クエリを好転させる」方法がわかりません。
SELECT id, pred, CONNECT_BY_ROOT id init, LEVEL, CONNECT_BY_ISLEAF "IsLeaf"
FROM data
CONNECT BY PRIOR pred=id
ORDER BY id, level;
結果を与える
id pred init lvl isLeaf
--------------------------
1 null 1 1 1
20 null 20 1 1
20 null 21 2 1
21 20 21 1 0
30 null 30 1 1
30 null 31 2 1
30 null 32 3 1
31 30 31 1 0
31 30 32 2 0
32 31 32 1 0
明らかに、「ツリー」全体を何らかの形で表しています。しかし、悲しいかな、「間違った方法」です。たとえば、
id pred init lvl isLeaf
21 20 0 ? ?
それ以外の
id pred init lvl isLeaf
21 20 21 1 0
データが必要な場合は、サンプル データを次に示します。
create table data ( id number primary key, pred number, name varchar2(100) );
insert into data(id,pred,name) values( 1 , null , 'One');
insert into data(id,pred,name) values( 20, null , 'Two');
insert into data(id,pred,name) values(21, 20 , 'Three');
insert into data(id,pred,name) values(30, null , 'Four');
insert into data(id,pred,name) values(31, 30 , 'Five');
insert into data(id,pred,name) values(32, 31 , 'Six');