两个表之间存在一对多的关系。每个表都有自己的标识主键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 |
感谢您提供任何帮助或建议。
答案 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