You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:47:59