我遇到类似于此SO question的情况,我希望将父行及其子行复制到同一个表中。
使用OUTPUT
和MERGE
的建议答案很简洁,但只考虑一条记录。
有没有办法修改它来处理多个父行?
修改
我尝试修改SQL语句并想出了这个:
DECLARE @fromId int, @toId int;
SET @fromId = 1;
SET @toId = 2;
DECLARE @mapping TABLE (old_id int, new_id int);
INSERT INTO parent_table (col1, col2, col3)
SELECT @toId, col2, col3
FROM parent_table
WHERE col1 = @fromId;
MERGE child_table tgt
USING (
SELECT t.parent_id, t.col2, t.col3
FROM child_table t
inner join parent_table p on p.id = t.parent_id
WHERE p.col1 = @toId
) src
ON 0 = 1
WHEN NOT MATCHED THEN
INSERT (parent_id, col2, col3) VALUES (src.parent_id, src.col2, src.col3)
OUTPUT src.parent_id, INSERTED.parent_id INTO @mapping (old_id, new_id);
父行的第一个INSERT
有效。但是,第二个插入插入任何子行。我错过了什么?
答案 0 :(得分:0)
您可以使用UNION运算符。我们只需要专注于维护列号和数据类型:
select <required-column names, add null if value for a column not required> from parent_table
UNION
select <required-column with null if value for that column not required> from child_table where id in(select id from parent_table);
例如假设目标有五列,父有三列,子有两列。 然后,根据父ID应该去的地方,我们可以写:
insert into destination(col1,col2, col3, col4, col5)
select col1, null, col2, col3, null from parent_table where key in(<key values>)
UNION
select col1, col2, null, null,null from child_table where key in(<key values>);
如果要复制所有记录:
insert into destination(col1,col2, col3, col4, col5)
select col1, null, col2, col3, null from parent_table
UNION
select col1, col2, null, null,null from child_table where key_column in(select key_column from parent_table);