将父行和子行复制到同一个表中?

时间:2016-05-01 12:32:24

标签: sql sql-server sql-server-2012

我遇到类似于此SO question的情况,我希望将父行及其子行复制到同一个表中。

使用OUTPUTMERGE的建议答案很简洁,但只考虑一条记录。

有没有办法修改它来处理多个父行?

修改

我尝试修改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有效。但是,第二个插入插入任何子行。我错过了什么?

1 个答案:

答案 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);