Oracle 18-19c如何将树形表中ID=2的子树复制到ID=6节点下?
在Oracle 18-19c中克隆树形表的子树到指定节点下
针对你提出的需求——把ID=2(值为'B')的整棵子树复制到ID=6(值为'CA')的节点下,在Oracle 18-19c中可以通过递归CTE(公共表表达式)结合序列的方式高效实现,下面是具体步骤和代码:
步骤1:创建序列生成新ID
原表已有ID到8的记录,我们需要一个序列来生成唯一的新ID,避免主键冲突:
CREATE SEQUENCE tree_seq START WITH 10;
步骤2:递归克隆子树并插入
使用递归CTE先定位要复制的子树,同时维护新的父子关系,最后批量插入到表中:
WITH cloned_nodes AS ( -- 锚点:复制目标子树的根节点(ID=2),父节点设为6 SELECT tree_seq.NEXTVAL AS new_id, id AS old_id, 6 AS new_parent_id, value FROM tree WHERE id = 2 UNION ALL -- 递归:遍历所有子节点,将子节点的父ID替换为对应父节点的新ID SELECT tree_seq.NEXTVAL AS new_id, t.id AS old_id, c.new_id AS new_parent_id, t.value FROM tree t INNER JOIN cloned_nodes c ON t.parent_id = c.old_id ) INSERT INTO tree (id, parent_id, value) SELECT new_id, new_parent_id, value FROM cloned_nodes;
验证结果
执行完插入后,你可以用层级查询查看ID=6下的新子树:
SELECT LPAD(' ', 2*(LEVEL-1)) || value AS tree_path, id, parent_id FROM tree CONNECT BY PRIOR id = parent_id START WITH id = 6;
输出会显示CA节点下新增了B、BC、BCX、BD这些复制过来的节点,结构和原ID=2的子树完全一致。
补充说明
- 如果不希望手动创建序列,也可以用
MAX(id)结合ROWNUM生成新ID,但这种方式在多用户并发操作时可能出现ID冲突,序列是更安全的选择。 - 若你的表存在其他约束(如唯一索引),需确保新生成的ID不会违反约束,序列的自增特性可以很好地避免这个问题。
内容的提问来源于stack exchange,提问作者Tomasz
相关产品推荐
相关产品推荐

