IT정보공유/DB

MSSQL 두개의 테이블 병합 Merge Into 구문

알지오™ 2019. 11. 11.

때때로 데이터베이스를 유지보수 하다보면 테이블을 합치는 테이블병합작업을 할 상황이 오게 됩니다.
아마도 보통은 데이터베이스를 옮기거나 특정한 목적때문에 기존 DB와 신규 DB 테이블을 합쳐야 하는
경우가 생길수도 있을겁니다.

 

단순하게 특정 DB에 있던 레코드들을 다른 한 곳으로 모으는 것이라면 
select insert 구문으로 쉽게 할 수 있을 것입니다.

다만, A와 B라는 테이블이 있을때, B테이블을 기준으로 같은 키의 데이터는 Update를.
데이터가 없을 경우는 Insert를 하려면 머리가 복잡해 질 수 밖에 없습니다.

MERGE INTO

  
SQL 구문인 MERGE INTO 문법을 모른다면 다면 말이죠.

이런 테이블 병합 작업을 생각보다 쉽고 빠르게 진행할 수 있습니다.
만약 똑같은 구조의 테이블 2개를 병합하는 것이라면 아주 간단하게 작업을 진행 할 수 있어요.

우선 테스트를 위해 아래와 같은 테이블 2개를 만들겁니다. TestA, TestB라는 테이블.

 

CREATE TABLE [dbo].[TestA](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[userSerialNo] [varchar](10) NOT NULL,
	[userName] [varchar](20) NOT NULL,
	[userOld] [int] NULL,
	[userPhone] [varchar](20) NULL,
	[userMemo] [varchar](100) NULL
) ON [PRIMARY]
GO

 

 

CREATE TABLE [dbo].[TestB](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[userSerialNo] [varchar](10) NOT NULL,
	[userName] [varchar](20) NOT NULL,
	[userOld] [int] NULL,
	[userPhone] [varchar](20) NULL,
	[userMemo] [varchar](100) NULL
) ON [PRIMARY]
GO

 

두 개의 테이블은 구조와 필드명 모두 동일합니다.

그리고, 아래의 Merge Into 구문을 통해 TestA라는 테이블에 TestB의 내용을 userSerialNo가 같은 레코드가 있을 경우는

업데이트, 없을 경우는 인서트를 해보도록 할겁니다.

 

Merge Into TestA as DestA
using (
		select id, userSerialNo, userName, userold, userphone, userMemo From TestB
      ) SourceB on ( DestA.userSerialNo = SourceB.userSerialNo
	               )
When Matched then
	Update set DestA.userName = SourceB.userName, DestA.userMemo = SourceB.userMemo
When Not Matched then
    Insert (userSerialNo, userName, userold, userphone, userMemo) 
       values (SourceB.userSerialNo, SourceB.userName, SourceB.userold, SourceB.userphone, SourceB.userMemo);
           

 

 

Merge Into 을 실행시킨 결과 입니다.

TestA의 테이블에 1개의 레코드가 있었고 TestB의 테이블에는 2개의 레코드가 있었지만, 알지오라는 레코드는 동일한 레코드였었습니다.

하지만 TestA.userMemo 필드가 TestB.userMemo 필드로 업데이트 되었습니다.

TestB 테이블에 있던 빅에너지라는 레코드가 TestA에 추가되었고요.

 

MERGE INTO 구문에서 Insert, Update, Delete 까지 동시에 수행이 가능합니다.
삭제하는 문장인 Delete 구문을 추가해봤습니다.

 

Merge Into TestA as DestA
using (
		select id, userSerialNo, userName, userold, userphone, userMemo From TestB
      ) SourceB on ( DestA.userSerialNo = SourceB.userSerialNo
	               )
When Matched And SourceB.userMemo = '업데이트' then
    Delete
When Matched then
	Update set DestA.userName = SourceB.userName, DestA.userMemo = SourceB.userMemo
When Not Matched then
    Insert (userSerialNo, userName, userold, userphone, userMemo) 
	       values (SourceB.userSerialNo, SourceB.userName, SourceB.userold, SourceB.userphone, SourceB.userMemo);
           

 

 

예제에서 테이블을 병합하면서 userMemo 필드가 업데이트 되었던 userName 알지오 레코드가
delete 처리된 것을 보실 수 있습니다. 

When Matched And SourceB.userMemo = '업데이트' then
    Delete

이 구문 때문이죠. SourceB.userMemo가 업데이트 였기 때문에 DestA 테이블에서 삭제되었습니다.

댓글

💲 추천 글