출처 : http://kokun.tistory.com/entry/MSSQL-%EC%A1%B0%EA%B1%B4%EB%B6%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B3%80%EA%B2%BD-MERGE




SQL Server 2008부터 제공되는 MERGE 문은 하나의 문장에서 경우에 따라서

INSERT, UPDATE, DELETE를 수행할 수 있는 구문이다.

​MERGE 구문의 활용을 연습해 보자. 이번 예의 ​간단한 시나리오는 다음과 같다.

​멤버 테이블(memberTBL)에는 기존 회원들이 있는데, 이 멤버 테이블에 직접 INSERT, DELETE, UPDATE를 사용하면 안 된다.

그리고 회원의 가입, 변경, 탈퇴가 생기면 변경 테이블(changeTBL)에 INSERT 문으로 회원의 변경 사항을 입력한다.

변경 테이블의 변경 사항은 신규가입/주소변경/회원탈퇴 3가지라고 가정하겠다.

반경 테이블의 작성이 완료된 후에, MERGER 구문으로 변경 테이블의 내용이 '신규가입' 이면 멤버 테이블에 새로 회원을 등록해주고,

'주소 변경' 이면 멤버 테이블의 주소를 변경하고, '회원 탈퇴' 면 멤버 테이블에서 해당 회원을 삭제하게 SQL 문을 작성해 보자.

1. 우선 멤버 테이블(memberTBL)을 정의하고, 데이터를 입력해 보자. 지금은 연습 중이므로

   기존 userTBL에서 아이디, 이름, 주소만 가져와서 단단히 만들겠다.

SELECT userID, name, addr INTO memberTBL FROM userTbl ;

SELECT * FROM memberTBL ;

​2. 변경 테이블(changeTBL)을 정의하고 데이터를 입력해 보자. 1명의 신규가입, 2명의 주소 변경, 2명의 회원 탈퇴가

   있는 것으로 가정해 보자.

CREATE TABLE changeTBL

​( changeType NCHAR(4) ,  -- 변경 사유

​  userID char(8) ,

​  name nvarchar(10) ,

​  addr nchar(2) ) ;

​GO

INSERT INTO changeTBL VALUES

​('신규가입', 'TPN', '티파니', '미국') ,

​('주소변경', 'LSG', null, '제주') ,

​('주소변경', 'LJB', null, '영국') ,

​('회원탈퇴', 'BBK', null, null) ,

​('회원탈퇴', 'SSK', null, null) ;

​3. 이제는 변경사유(chageType) 열에 의해서 기존 멤버 테이블의 데이터를 변경한다. 5개 행이 영향을 받을 것이다.

MERGE memberTBL AS M   -- 변경될 테이블 (target 테이블)

USING changeTBL AS C   -- 변경할 기준이 되는 테이블 (source 테이블)

ON M.userID = C.userID   -- userID를 기준으로 두 테이블을 비교한다.

-- target 테이블에 source 테이블의 행이 없고, 사유가 '신규가입'이라면 새로운 행을 추가한다.

WHEN NOT MATCHED AND changeType = '신규가입' THEN

​INSERT (userID, name, addr) VALUES(C.userID, C.name, C.addr)

-- target 테이블에 source 테이블의 행이 있고, 사유가 '주소변경'이라면 주소를 변경한다.

WHEN MATCHED AND changeType = '주소변경' THEN

​UPDATE SET M.addr = C.addr

-- target 테이블에 source 테이블의 행이 있고, 사유가 '회원탈퇴'라면 해당 행을 삭제한다.

WHEN MATCHED AND changeType = '회원탈퇴' THEN

​DELETE ;

​4. 멤버 테이블을 조회해 보자. 계획대로 1개 행이 추가되고, 2개 행은 삭제, 2개 행은 주소가 변경되었다.

SELECT * FROM memberTBL ;

Posted by 요지
,