Mergeのテクニック
10469 ワード
今日はデータを移動してMergeを使う方法を皆さんと共有します.
ある时、私达がデータの移动をする时、时にはテストをして、対象を変えて、时には外部キーが存在して、どのように対応する関系を知りません.例えば私は今同じアーキテクチャの2つのtableを持っています.
A 1 A 2及びT 1 T 2
それから私はデータをT 1 T 2の中に移して、ここで1つのIDの対応する問題に関連して、私はどのようにA 1のID=3の対応がT 1のID=であることを知っていますか?(もちろんあなたはidentity insertのじゃあマーガレットを使います
そしてデータが運ばれ、物語は終わり....
ある时、私达がデータの移动をする时、时にはテストをして、対象を変えて、时には外部キーが存在して、どのように対応する関系を知りません.例えば私は今同じアーキテクチャの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
そしてデータが運ばれ、物語は終わり....