2016-07-21 8 views
0

私はUserId、ItemId、およびSomeDataを持つターゲットテーブルを持っています。 ItemIdが見つからないことに基づいてターゲットを更新するために使用するソーステーブルがあります。2つの列を一致させる必要がある場合のSQLマージ方法

例で説明たぶん簡単に...

これは、ターゲットと既存のデータです:

UserId ItemId SomeData 
1  1  x 
2  2  y 
2  3  z 

そして私は、特定のユーザーのためのいくつかのアイテムIDを保持している別の一時的なソーステーブルを持っています。そのUserIdにすでにそのItemIdがある場合は、無視します。そこになければ、それを加えてください。私は期待してい

UserId ItemId SomeData 
1  1  x  <--- this ItemId already exist for UserId=1, ignore 
1  2  a  <--- the next two ItemId don't exist for UserId=1, add them 
1  3  b 

結果セットは、このようなものです:

UserId ItemId SomeData 
    1  1  x 
    2  2  y 
    2  3  z 
    1  2  a <--- added 
    1  3  b <--- added 

私は行方不明のItemIdのレコードを挿入することができるようにmergeコマンド内のテーブルを結合するために適切な方法で苦労していますユーザー。

MERGE Target T 
USING Source S 
ON T.UserId = S.UserId --This doesn't get the right matches but neither does joining it by ItemId 
WHEN NOT MATCHED 
    THEN 
    INSERT bah bah bah 

どうすればいいですか?

+2

あなたが 'Userid'と' Itemid'を気にしているならば、 'ON'セクションにそれらを両方追加してください:' T.UserId = S.UserId AND T.ItemID = S.ItemID' –

答えて

1
MERGE INTO @tb AS T 
USING @tmpTb AS S 
    ON T.userId = S.userId AND T.itemId = S.itemId 
WHEN NOT MATCHED THEN 
    INSERT (userId, itemId, someData) 
    VALUES (S.userId, S.itemId , S.someData); 

ここ@tbターゲットテーブルであり@tmpTbソーステーブルです。

1

ただ、これはあなたが... UNIONを使用することによって、あなたはすべての重複も存在しますUNIONを使用して、任意の重複.INケースなしで2つのテーブルをマージすることができます助ける条件

MERGE Target T 
USING Source S 
ON (T.UserId = S.UserId AND T.ItemId = S.ItemId) 
WHEN NOT MATCHED 
    THEN 
    INSERT bah bah bah 
0

ItemIdを追加します。

insert into Result_Table 
    select UserId,ItemId,SomeData from table_one 
    union 
    select UserId,ItemId,SomeData from table_two 
関連する問題