2016-05-01 18 views
0

私は親テーブルとその子テーブルを同じテーブルとの間でコピーするこのSO questionに似た状況があります。親テーブルと子テーブルを同じテーブルにコピーしますか?

OUTPUTMERGEを使用して提案された回答はきれいですが、1つのレコードのみを考慮しています。

複数の親行を処理するためにそれを変更する方法はありますか?

EDIT

私は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。ただし、2番目の挿入は子行を挿入しません。私は何が欠けていますか?

+0

共有いくつかのサンプルレコード。 parent_id 2での値のホッピングは、子テーブルに存在します。 –

答えて

0

UNION演算子を使用できます。列番号とデータタイプを維持することに集中すればよい:

宛先に5つの列があり、親に3つの列があり、子に2つの列があるとします。 その後、親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);