Mergeのテクニック

10469 ワード

今日はデータを移動してMergeを使う方法を皆さんと共有します.
ある时、私达がデータの移动をする时、时にはテストをして、対象を変えて、时には外部キーが存在して、どのように対応する関系を知りません.例えば私は今同じアーキテクチャの2つのtableを持っています.
A 1 A 2及びT 1 T 2
create table A1(ID int identity(1,1) primary key,Name varchar(50));
create table A2(ID int identity(1,1) primary key,A1ID int,Name varchar(50));

create table T1(ID int identity(1,1) primary key,Name varchar(50));
create table T2(ID int identity(1,1) primary key,T1ID int,Name varchar(50));

-- 
insert into A1(Name) values ('A'),('C'),('B'),('D'),('E'),('F');

-- , ID 
delete from A1 where ID in (2,4);
insert into A2(A1ID,Name) values (1,'AA'),(3,'BB'),(5,'EE'),(6,'FF');

-- 
select * from A1;
ID          Name
----------- --------------------------------------------------
1           A
3           B
5           E
6           F
select * from A2;
ID          A1ID        Name
----------- ----------- --------------------------------------------------
1           1           AA
2           3           BB
3           5           EE
4           6           FF

それから私はデータをT 1 T 2の中に移して、ここで1つのIDの対応する問題に関連して、私はどのようにA 1のID=3の対応がT 1のID=であることを知っていますか?(もちろんあなたはidentity insertのじゃあマーガレットを使います
-- 
create table #Tmp(A1ID int,T1ID int);

-- Merge , Output 
merge T1
using A1
on 1 = 0
when not matched then insert (Name) values(Name) output A1.ID,inserted.ID into #Tmp(A1ID,T1ID);

-- #Tmp  A1   T1  ID 
insert into T2(T1ID,Name)
select #Tmp.T1ID,A2.Name
    from A2
        inner join #Tmp ON A2.A1ID = #Tmp.A1ID;

select * from T1
ID          Name
----------- --------------------------------------------------
1           A
2           B
3           E
4           F

select * from T2
ID          T1ID        Name
----------- ----------- --------------------------------------------------
1           1           AA
2           2           BB
3           3           EE
4           4           FF

 
 
そしてデータが運ばれ、物語は終わり....