我有一张这样的桌子:
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 中工作)