【问题标题】:Oracle copying the tree in the tableOracle 复制表中的树
【发布时间】:2020-07-30 14:12:14
【问题描述】:

我正在寻找一些有趣的简单算法来将树的一部分复制(克隆)到树的另一部分。

我们有一张桌子:

create table tree (
     id integer not null,
     parent_id integer,
     value varchar2(255),
     CONSTRAINT tab_pk PRIMARY KEY (id)
  );

begin
  insert into tree(id, parent_id, value) values (1, null, 'A');
  insert into tree(id, parent_id, value) values (2, 1, 'B');
  insert into tree(id, parent_id, value) values (3, 1, 'C');
  insert into tree(id, parent_id, value) values (4, 2, 'BC');
  insert into tree(id, parent_id, value) values (8, 4, 'BCX');
  insert into tree(id, parent_id, value) values (5, 2, 'BD');
  insert into tree(id, parent_id, value) values (6, 3, 'CA');
  insert into tree(id, parent_id, value) values (7, 3, 'CD');
end;
/

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=9fe802f144a3af0663754cfb3e8dc1ba

如何轻松复制“CA”(ID = 6)下所有子节点的树“B”(ID = 2)?

甲骨文 18-19c。

【问题讨论】:

  • 您能否详细说明您的问题。您希望 B 包含在 CA 中吗?对吗?
  • 您想要 ID=2 的孩子加上 ID=6 中 CA 下的孩子,包括 CA ??
  • 我想将树(B 和孩子)复制到树中的另一个地方(CA)(在表中而不是在 SQL 中)

标签: sql oracle tree


【解决方案1】:

我试图理解你的问题

您的原始查询提供此输出

select level, id, 
       lpad ( ' ', level, ' ' ) || value name 
from   tree
start  with parent_id is null
connect by prior id = parent_id;

LE  ID  NAME
1   1    A
2   2     B
3   4      BC
4   8       BCX
3   5      BD
2   3     C
3   6      CA
3   7      CD

然后你说你想要树“B”(ID = 2),所有孩子都在“CA”下(ID = 6)

select level, id, 
       lpad ( ' ', level, ' ' ) || value name 
from   tree
start  with id = 2
connect by prior id = parent_id
union all
-- tree to clone
select level, id, 
       lpad ( ' ', level, ' ' ) || value name 
from   tree
start  with id = 6 or id=7 
connect by prior id = parent_id;


LE  ID  NAME
1   2    B
2   4     BC
3   8      BCX
2   5     BD
1   6    CA
1   7    CD

db<>fiddle

【讨论】:

  • 我想将树(B 和孩子)复制到树中的另一个位置(CA)(在表中而不是在 SQL 中)
猜你喜欢
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 2020-04-25
  • 2021-03-15
相关资源
最近更新 更多