gpt4 book ai didi

sql - 如何复制自引用表的行

转载 作者:行者123 更新时间:2023-12-03 02:29:46 25 4
gpt4 key购买 nike

假设我们有一个像这样的自引用表

CREATE TABLE Month
(
Id int IDENTITY(1,1) PRIMARY KEY,
Title char(128)
)
CREATE TABLE Entity
(
Id int IDENTITY(1,1) PRIMARY KEY,
MonthId int FOREIGN KEY REFERENCES Month(Id),
Name char(128),
ParentId int FOREIGN KEY REFERENCES Entity(Id),
)

我想将某个 MonthId 的所有行复制到另一个 MonthId。重复的parentId也应该更新,实体及其父实体应该在同一个月。

举个例子,假设我们有

Id        MonthId    Name     ParentId
------------------------------------
1 1 name1 null
2 1 name11 1
3 1 name3 null
4 1 name31 3
5 1 name311 4

将monthId=1行复制到monthId=2后,结果应如下所示:

Id        MonthId    Name     ParentId
------------------------------------
1 1 name1 null
2 1 name11 1
3 1 name3 null
4 1 name31 3
5 1 name311 4
newId1 2 name1 null
newId2 2 name11 newId1
newId3 2 name3 null
newId4 2 name31 newId3
newId5 2 name311 newId4

newId 是 DBMS 生成的值。

注意:我使用 Sql-Server 2012 作为 DBMS。

最佳答案

无需任何假设即可正常工作:

DECLARE @baseMonthId int = 1
DECLARE @newMonthId int = 2

DECLARE @newRows TABLE(id int, orig_id int)

MERGE INTO Entity
USING (
SELECT Id, Name, ParentId FROM Entity WHERE MonthId = @baseMonthId
) AS cf
ON 1 = 0
WHEN NOT MATCHED THEN
INSERT(MonthId, Name, ParentId) Values(@newMonthId, cf.Name, cf.ParentId)
OUTPUT inserted.Id, cf.Id INTO @newRows(id, orig_id);

UPDATE Entity
SET Parentid =
(
SELECT
nr.id
FROM @newRows nr
WHERE nr.orig_id = Entity.ParentId
)
WHERE MonthId = @newMonthId;

结果:

enter image description here

关于sql - 如何复制自引用表的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31365083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com