gpt4 book ai didi

sql - 在sql中有效地复制记录

转载 作者:行者123 更新时间:2023-12-04 06:46:24 25 4
gpt4 key购买 nike

我有一个场景,我有一个父表,它与两个或三个表具有“一对多”关系。这些子表再次与更多表具有“一对多”关系,依此类推。这上升到 5 到 6 个层次结构。

现在,基于父表的单个主键值,我想在数据库中复制与其相关的所有信息。我编写了一个存储过程,它使用游标并逐个插入子行,并在每次插入时设置新的外键值。但是由于子表中的记录数很高,因此需要一些时间。

有没有其他有效的方法来做到这一点?

最佳答案

SQL Server 2008 :

CREATE TABLE t_parent (id INT NOT NULL PRIMARY KEY IDENTITY, value VARCHAR(100))
CREATE TABLE t_child (id INT NOT NULL PRIMARY KEY IDENTITY, parent INT NOT NULL, value VARCHAR(100))
CREATE TABLE t_grandchild (id INT NOT NULL PRIMARY KEY IDENTITY, child INT NOT NULL, value VARCHAR(100))

INSERT
INTO t_parent (value)
VALUES ('Parent 1')

INSERT
INTO t_parent (value)
VALUES ('Parent 2')

INSERT
INTO t_child (parent, value)
VALUES (1, 'Child 2')

INSERT
INTO t_child (parent, value)
VALUES (2, 'Child 2')

INSERT
INTO t_grandchild (child, value)
VALUES (1, 'Grandchild 1')

INSERT
INTO t_grandchild (child, value)
VALUES (1, 'Grandchild 2')

INSERT
INTO t_grandchild (child, value)
VALUES (2, 'Grandchild 3')

DECLARE @tt TABLE (oid INT, nid INT)

MERGE
INTO t_parent
USING (
SELECT id, value
FROM t_parent
) p
ON 1 = 0
WHEN NOT MATCHED THEN
INSERT (value)
VALUES (value)
OUTPUT p.id, INSERTED.id
INTO @tt;

MERGE
INTO t_child
USING (
SELECT c.id, p.nid, c.value
FROM @tt p
JOIN t_child c
ON c.parent = p.oid
) c
ON 1 = 0
WHEN NOT MATCHED THEN
INSERT (parent, value)
VALUES (nid, value)
OUTPUT c.id, INSERTED.id
INTO @tt;

INSERT
INTO t_grandchild (child, value)
SELECT c.nid, gc.value
FROM @tt c
JOIN t_grandchild gc
ON gc.child = c.oid

SQL Server 的早期版本中,你必须做一个 SELECT后跟一个 INSERT找出 PRIMARY KEY 的新值.

关于sql - 在sql中有效地复制记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3717871/

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