2016-07-21 3 views
0

UserId, ItemId 및 SomeData가있는 대상 테이블이 있습니다. 누락 된 ItemId를 기반으로 대상을 업데이트하는 데 사용할 원본 테이블이 있습니다.두 개의 열이 일치해야하는 경우 SQL 병합 방법

예를 들어 설명 어쩌면 쉽게 ...

이 대상과 기존 데이터입니다 :

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

그리고 특정 사용자에 대한 몇 가지 항목 Id를 보유하고 다른 임시 소스 테이블을 가지고있다. 해당 UserId에 이미 해당 ItemId가 있으면 무시하십시오. 없으면 추가하십시오. 나는에 대한 누락 된 항목 Id의 레코드를 삽입 할 수 있도록 병합 명령을 내 테이블을 조인하는 적절한 방법과 사투를 벌인거야

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

을 : 내가 기대하고있어

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 

결과 집합은 다음과 같이이다 사용자.

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

그냥 당신이 어떤 중복이 두 테이블 .IN UNION에게 의지도 존재하는 모든 중복을 사용하는 경우를 병합 할 수 있습니다 UNION을 사용하여 조건

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 
관련 문제