【讨论】把树tree 的某个层级打断 添加新数据后 再把层级拼接完整

[复制链接]
查看11 | 回复9 | 2015-12-23 11:56:36 | 显示全部楼层 |阅读模式
本帖最后由 chiyhong 于 2015-10-22 17:19 编辑
如果用 with 迭代语句 或者 connnect by生成一个树后,需要对有一个层级 打断,然后在该层级上添加新的数据 后 在把打断的树 拼接完成..... 如下:

层级 1
1
层级 2
2 , 3

层级 3
4 5 6 , 678

如果想在层级2 把 3的的分支 用以下数据替换
层级 1
3
层级 2
11 ,12

最终想要的结果是:
层级 1
1
层级 2
2

3

层级 3
4 5 6 , 11 , 12
层级 4
678,678

需要做层级替换,还要做一个 字层级的笛卡尔积 ,还要维护 层级 ,兄弟们有高招吗?
或者说如何在建树的时候 把 2个表的数据 遍历成上面的那棵树?

create table taba (id number ,name varchar2(255),pid int);
create table tabb (id number ,name varchar2(255),pid int);
insert into taba values(1, 'P1-S1-T1', '');
insert into taba values(2, 'G1', 1);
insert into taba values(3, 'P4-S1-T1', 1);
insert into taba values(4, 'P2-S1-T1', 2);
insert into taba values(5, 'P5-S1-T1', 2);
insert into taba values(6, 'P6-S1-T1', 2);
insert into taba values(7, 'P3-S1-T1',4 );

insert into tabb values(2, 'G1', 1);
insert into tabb values(4, 'P2-S1-T1', 2);
insert into tabb values(11, 'G2',2 );
insert into tabb values(12, 'P6',2 );
insert into tabb values(13, 'P1',4 );
--原始的树
with t(id,
name,
pid,
nlevel) as
(select id, name, pid, 1 nlevel
from taba
where name = 'G1'
union all
select s.id, s.name, s.pid, 1 + t.nlevel
from t, taba s
where t.id = s.pid)
select * from t
--要添加的树
with t(id,
name,
pid,
nlevel) as
(select id, name, pid, 1 nlevel
from tabb
where pid = 2
union all
select s.id, s.name, s.pid, 1 + t.nlevel
from t, tabb s
where t.id = s.pid )
select * from t


回复

使用道具 举报

千问 | 2015-12-23 11:56:36 | 显示全部楼层
好高大上的想法
回复

使用道具 举报

千问 | 2015-12-23 11:56:36 | 显示全部楼层
ITtomilk 发表于 2015-10-22 17:14
好高大上的想法

有相关业务需求
回复

使用道具 举报

千问 | 2015-12-23 11:56:36 | 显示全部楼层
用{11,12}和3的子树做笛卡尔积,合并上{11,12} 然后插入到表中。
回复

使用道具 举报

千问 | 2015-12-23 11:56:36 | 显示全部楼层
造的数据完全看不出来你这是在干嘛
回复

使用道具 举报

千问 | 2015-12-23 11:56:36 | 显示全部楼层
再者,11 下面有个13 怎么办?
回复

使用道具 举报

千问 | 2015-12-23 11:56:36 | 显示全部楼层
这是要实现oracle数据库索引维护的功能,尤其是插入数据和删除数据是,索引维护, 也就是索引分裂的功能, 这种数据库实现效率很低, 如果表设计本身就是由层次关系的,那么最终所有数据的树形结构直接用start with connect by即可,如果你的表本身没有设计成层次关系, 那么这种代码维护效率非常低
回复

使用道具 举报

千问 | 2015-12-23 11:56:36 | 显示全部楼层
2009532140 发表于 2015-10-23 15:23
再者,11 下面有个13 怎么办?

代码已经实现了,就是建临时表,然后构造新的结构的树。
这个是一个供应链的一个需求,taba表记录的是产品和原料的继承关系(树形结构),
tabb表记录的是 产品 经过的 生产流程 (业务定义是 一个产品 由0,1个或多个生产流程 ,但是只有1个层级的生产,及树的层级最多为1)
最终 在数据展示 和分析是, 需要把以上2个表,即 产品 和原料 和可能有的工序 连接起来使用
回复

使用道具 举报

千问 | 2015-12-23 11:56:36 | 显示全部楼层
bell6248 发表于 2015-10-23 16:16
这是要实现oracle数据库索引维护的功能,尤其是插入数据和删除数据是,索引维护, 也就是索引分裂的功能,...

是的我现在是使用的 gtt 的方法 去构造数据
回复

使用道具 举报

千问 | 2015-12-23 11:56:36 | 显示全部楼层
chiyhong 发表于 2015-11-2 11:02
代码已经实现了,就是建临时表,然后构造新的结构的树。
这个是一个供应链的一个需求,taba表记录的是产 ...

好的,有时间我写一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行