当我需要匹配两列时,如何进行SQL合并

时间:2016-07-21 04:11:18

标签: sql

我有一个具有UserId,ItemId和SomeData的目标表。我有一个源表,我想根据缺少的ItemId来更新目标。

在示例中可能更容易解释......

这是目标和现有数据:

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

我有另一个临时源表,其中包含特定用户的一些ItemId。如果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

我正在努力以合适的方式在merge命令中加入表格,以便我可以为用户插入缺少的ItemId记录。

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

我该怎么做?

3 个答案:

答案 0 :(得分:1)

只需将ItemId添加到条件

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

答案 1 :(得分: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是源表。

答案 2 :(得分:0)

这将有助于您...通过使用UNION,您可以合并两个表而不会有任何重复。如果使用UNION,所有重复项也将存在。

insert into Result_Table
    select UserId,ItemId,SomeData from table_one
    union
    select UserId,ItemId,SomeData from table_two