我有一张桌子,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
列。它们只形成链而不是树——每个节点只有一个或零个继任者(如果这很重要的话)。
我想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');