1

我有一张这样的桌子:

CREATE TABLE IF NOT EXISTS THING(
          Id int NOT NULL IDENTITY(1, 1),
          IdParent int,
          randomtext varchar(255)
        )

我想将给定的 id 列表与他们的孩子、孙辈一起复制,但是当我尝试它时,它会保留古老的父 ID,因此不会保留这样的层次结构:

| Id | IdParent | random text |
-------------------------------
| 1  | 0        | "aaaaaaaaa" |
| 2  | 1        | "tt"        |
| 3  | 2        | "third"     |
| 4  | 0        | "fourth"    |
| 5  | 0        | "randOther" |

如果我给出 ids 列表 (1, 4) 和另一个像“10”这样的 parntid 值,它会复制 id 为 1 和 4 的行,新的父 id 为 10,但重复的子节点会获得新插入的父节点,因此它会保持层次结构

| Id | IdParent | random text       |
-------------------------------------
| 1  | 0        | "aaaaaaaaa"       |
| 2  | 1        | "tt"              |
| 3  | 2        | "third"           |
| 4  | 0        | "fourth"          |
| 5  | 0        | "randOther"       |
| 6  | 10       | "aaaaaaaaa -copy" |
| 7  | 6        | "tt- copy"        |
| 8  | 7        | "third- copy"     |
| 9  | 10       | "fourth- copy"    |

我现在要做的就是使用此查询将所有副本放入新父级,但我不想将所有子级都放入新父级

WITH HIERARCHY (Id)
AS (SELECT Id FROM THING
WHERE Id IN (1,4) 
UNION ALL
   SELECT e.Id
   FROM THING e
   INNER JOIN HIERARCHY h ON e.IdParent = h.Id 
)
INSERT INTO THING (IdParent, randomtext)
SELECT 10, randomtext
FROM THING
WHERE Id IN (SELECT * FROM HIERARCHY)

(查询应该在 sql server 2008 和 oracle 中工作)

4

0 回答 0