SQL/MS-SQL & SQL Server Management Studio

[MS SQL] INSERT,UPDATE 한번에 처리하기 (MERGE )

삐뚤어진 개발자 2019. 9. 24.

MSSQL 에서 MERGE INTO 구문을 사용하는 방법을 알아보겠습니다.

 

MERGE INTO 구문을 사용하면,

단일 쿼리에서 한번에 여러가지 DML(INSERT, UPDATE, DELETE ) 작업을 수행할 수 있습니다.

 

(INSERT, UPDATE, DELETE를 한번에 처리할 수 있습니다.) 

 

 

 

 

 

여러 DML 작업이 단일 쿼리에서 작동되기 때문에 각각 쿼리를 짜 작업해주는 것 보다 성능이 향상 됩니다.

또한, PK값때문에 INSERT 작업이 힘든 로직을 짜야할 경우 유용하다 할수 있습니다. 

 

 

- 기본 문법

MERGE 변경될테이블명 AS A
	USING 비교테이블명 AS B
	ON A.컬럼명 = B.컬럼명
	WHEN MATCHED THEN
	--일치 할때 쿼리문
	WHEN NOT MATCHED THEN
   	--불일치 할때 쿼리문

 

예를들어,

TARGET 테이블(변경될 테이블)의 데이터에

SOURCE 테이블(비교할 테이블)의 데이터를 비교해서 

그 데이터가 있다면, UPDATE를 실행하고, 없다면, INSERT 하게 하는 구문입니다.

 

Ex) 

MERGE TB_TARGET AS [TARGET]
	USING TB_SOURCE AS [SOURCE]
	ON [TARGET].CUSTOM_ID = [SOURCE].CUSTOM_ID
    
	-- 테이블 TB_TARGET의 CUSTOM_ID 값이 TB_SOURCE의 CUSTOM_ID 중에 있을 경우
    -- UPDATE
    WHEN MATCHED THEN
		UPDATE SET
        	,[TARGET].CUSTOM_NAME = [SOURCE].CUSTOM_NAME
        	,[TARGET].CUSTOM_REMARK = 'TB_SOURCE에 있는 사람입니다.'
            
    -- 테이블 TB_TARGET의 CUSTOM_ID 값이 TB_SOURCE의 CUSTOM_ID 중에 없을 경우
	-- INSERT
    WHEN NOT MATCHED THEN
   		INSERT (CUSTOM_ID, CUSTOM_NAME, CUSTOM_REMARK)
        VALUES (@@ROW_NUMBER, '링고비' ,'새로운 사람')

손님의 데이터를 관리하는 테이블이 2개가 있었는데, 테이블을 하나로 줄이려고 합니다.

 

그래서 TB_TARGET에 TB_SOURCE 데이터를 넣으려고 하는데 중복된 손님 정보는 UPDATE하고

중복되지 않은 손님 정보는 INSERT 쿼리를 실행하는 간단한 예시입니다.

 

 

 

 

 

- 조건을 추가해서 사용할 수도 있습니다.

MERGE 변경될테이블명 AS A
	USING 비교테이블명 AS B
	ON A.컬럼명 = B.컬럼명
	WHEN MATCHED AND 조건 THEN
	--일치 + 조건 할때 쿼리문
	WHEN NOT MATCHED AND 조건A THEN
   	--불일치 + 조건A 할때 쿼리문
    WHEN NOT MATCHED AND 조건B THEN
   	--불일치 + 조건B 할때 쿼리문

 

 

 

 

 

 

 

 

더 자세한 내용은 MSDN을 참조하면 됩니다.

 

MERGE(Transact-SQL) - SQL Server

MERGE(Transact-SQL)MERGE (Transact-SQL) 이 문서의 내용 --> 적용 대상: SQL Server Azure SQL DatabaseAzure Synapse Analytics(SQL DW) 병렬 데이터 웨어하우스 APPLIES TO: SQL Server Azure SQL Database Azure Synapse Analytics (SQL DW) Parallel Data Warehouse 원본 테이블과의 조인 결과를 기반으로 대상

docs.microsoft.com

 

댓글