0

idaID PKとを持つテーブル A と B がありidbます。

例A:

ida    col1     col2   idb
---------------------------
1      xxxx     foo    NULL
2      yyyy     bar    NULL

例 B:

idb    col3     col4  
----------------------
110    uuuu     rrr  
111    vvvv     ttt   

AI の行ごとに、B に行を挿入する必要があります。次に、B に挿入した行の ID で A を更新し、それらの間の一致を維持する必要があります。A と B の間には他の関係はなく、A からのデータは B に入りません。

挿入後、B は次のようになります。

idb    col3     col4  
----------------------
110    uuuu     rrr  
111    vvvv     ttt   
112    aaaa     www    
113    bbbb     mmm    

A の更新後、A はたとえば次のようになります。

ida    col1     col2   idb
---------------------------
1      xxxx     foo    112
2      yyyy     bar    113

ここで問題は、B のどのレコードが A のどのレコードに対応するかをどのように判断するかということです。これらの間には関係がないためです。ループ内で 1 つずつ挿入して更新することはできますが、多くのレコードの場合、これは問題になる可能性があります。

これをより少ない手順で行う方法はありますか?

4

2 に答える 2

1

これの鍵はMERGE、テーブルBに挿入するステートメントを作成できるかどうかです。可能であれば、テーブルBに新しく挿入された行と、テーブルAの対応する行の両方OUTPUTを参照する句を作成できるためです。残念ながら、ステートメントでこれを行わないでください。INSERT

以下のスクリプトはすべて一度に実行する必要があります。スクリプトを分割して、何が起こっているかを示します。

データ設定:

declare @TabA table (ida int IDENTITY(1,1),col1 char(4),col2 char(3),idb int)
insert into @TabA(col1,col2,idb) values 
('xxxx','foo',NULL),
('yyyy','bar',NULL)

declare @TabB table (idb int IDENTITY(110,1),col3 char(4),col4 char(3))
insert into @TabB(col3,col4) values
('uuuu','rrr'),
('vvvv','ttt')

MERGE挿入を行うことを余儀なくされています。ただし、ここでの式は、テーブルAの値から、およびテーブルAの値に基づいCASEて新しい値を導出します。ここでは、IDを使用していますが、必要なことは何でもです。col3col4

declare @Res table (ida int,idb int)

;merge into @TabB tb
using (select ida,col1,col2 from @TabA where idb is null) src
on 1 = 0
when not matched then insert (col3,col4) values (case src.ida when 1 then 'aaaa' else 'bbbb' end,case src.ida when 1 then 'www' else 'mmm' end)
output src.ida,inserted.idb into @Res;

これで@Res、2つのテーブルからの一致するIDが含まれるため、新しいIDをテーブルAにコピーして戻す更新を簡単に作成できます。

update a set idb = r.idb
from @TabA a
inner join @Res r on a.ida = r.ida

そして結果:

select * from @TabA
select * from @TabB

ida         col1 col2 idb
----------- ---- ---- -----------
1           xxxx foo  112
2           yyyy bar  113

(2 row(s) affected)

idb         col3 col4
----------- ---- ----
110         uuuu rrr
111         vvvv ttt
112         aaaa www
113         bbbb mmm
于 2012-06-24T09:22:56.443 に答える
1

あなたの要件に基づいて、これはあなたが結果を達成するために試みることができるものです

  Declare @countA int
  Declare @value int
  set @value =0
  Select @countA=count(*) from TableA

  while @value<@countA
  BEGIN
  Insert into TableB (idb,col3,Col4)
  select max(idb)+1,'aaa','BBBB' from TableB  --I don't know from where you get the values for col3    and col4
  Update TableA
  set idb=(Select max(idb) from TableB) where idb is null and @value+1=ida
  set @value=@value+1
  END
于 2012-06-24T09:04:06.173 に答える