我们如何克隆一组一对多记录?

时间:2017-08-06 05:47:57

标签: sql sql-server

两个表之间存在一对多的关系。每个表都有自己的标识主键ID。问题是克隆Table1中的一些(或简称所有)记录及其在Table2中的相关记录,然后我们将在表1和表2中的所有记录中复制相同的表。
例如,考虑这个例子:

CREATE TABLE Categories
(
    Id          INT IDENTITY,
    OtherData   INT
)
CREATE TABLE Products
(
    Id          INT IDENTITY,
    CategoryId  INT CONSTRAINT FK_Category_Products 
                    FOREIGN KEY REFERENCES dbo.Categories(Id),
    ProductData INT
)

我们如何制作此副本。为了完成这项工作,使用了多少命令没有限制。

编辑:
主要问题是在复制记录时保存一两对多的关系。

示例:

Categories:                 Products:
|  Id  |  OtherData  |      |  Id  |  CategoryId |  ProductData  |  
|------|-------------|      |------|-------------|---------------|  
|   1  |    10       |      |  11  |    1        |    20         |  
|   2  |    10       |      |  12  |    2        |    30         |  

复制后,我们需要这些数据:

Categories:                 Products:
|  Id  |  OtherData  |      |  Id  |  CategoryId |  ProductData  |  
|------|-------------|      |------|-------------|---------------|  
|   1  |    10       |      |  11  |    1        |    20         |  
|   2  |    10       |      |  12  |    2        |    30         |  
|   3  |    10       |      |  13  |    3        |    20         |  
|   4  |    10       |      |  14  |    4        |    30         |  

感谢您提供任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

正如Ivan Starostin在评论中写道,诀窍是使用Merge填充父类别,将旧id和新id输出到地图表中,并使用该地图表插入产品: / p>

-- Declare the map table 
DECLARE @Map as table
(
    OldId int,
    NewId int
)

-- Duplicate the records of the Categories table
MERGE INTO Categories
USING 
(
    SELECT Id, OtherData 
    FROM Categories 
) As s ON 1 = 0 -- Always not matched
WHEN NOT MATCHED THEN
INSERT (OtherData)
VALUES (OtherData)
OUTPUT s.Id, Inserted.Id
INTO @Map (OldID, NewId); -- Note the output clause

-- Duplicate the records in the Products table (Note the inner join)
INSERT INTO Products (CategoryId, ProductData)
SELECT NewId, ProductData
FROM Products 
INNER JOIN @Map m ON CategoryId = OldId