[MSSQL] MERGE 구문 설명 및 사용법 (데이터 입력/수정/삭제)

이번 MS-SQL 포스팅에서는 MERGE 구문에 대해서 살펴보겠습니다.

 

 

데이터에 대한 INSERT(입력) / UPDATE(수정) / DELETE(삭제)를 처리할 수 있는 MERGE문을 알아볼까요~?

 

 


 

MERGE 구문?

  • 변경할 테이블에 대해 데이터 존재하는가의 여부를 체크 후, INSERT/UPDATE/DELETE를 한 번에 처리 가능합니다.
       > 단일 문에서 여러 DML에 해당하는 데이터 입력/수정/삭제 처리가 가능합니다. :)
  • 즉, 여러 개의 개별 DML문을 단일 문으로 대체 가능합니다.
  • 작업이 하나의 문 내에서 수행되며, 이를 통해 데이터가 처리되는 횟수 최소화 및 쿼리 성능 향상이 가능합니다.

 

MERGE 구문 사용법?

MERGE  INTO [변경될 테이블]
USING [기준 테이블 | 서브 쿼리]
ON [조건문]
WHEN MATCHED THEN
	[조건 일치할 때의 쿼리]
WHEN NOT MATCHED THEN
	[조건 불일치할 때의 쿼리]

[조건 일치/불일치할 때의 쿼리]

UPDATE SET 컬럼명 = '값'

DELETE

INSERT 컬럼명 VALUES ('값') 

   -> 다음과 같은 DML 문들이 들어갈 수 있습니다.😁

 

 

MERGE 구문 예제

1. 예시 테이블

1) TEMP_A

  GUBUN(구분) COLORNO COLORNM PRICE
1 마우스 1 RED 2,000
2 키보드 5 Orange 5,000
3 마우스 2 BLACK 15,000
4 모니터 3 WHITE 20,000

 

2) TEMP_B

   STATUS(상태) GUBUN(구분) COLORNO COLORNM PRICE
1 정상 마우스 1 RED 2,000
2 반품 키보드 5 Orange 5,000
3 폐기 마우스 2 BLACK 15,000
4 정상 모니터 3 WHITE 20,000

 

MS SQL에서는 dummy 서브 쿼리를 사용합니다.

(Oracle에는 DUAL dummy 테이블을 USING 절에 사용하면, 단일 테이블 작업이 간단합니다...😂)

MERGE INTO MA_COLOR AS C
USING (SELECT 1 AS DUAL) AS D
	ON (C.COLORNO = 10)
WHEN MATCHED THEN
	UPDATE SET C.COLORNM = '빨강', C.FLAG1 = '1'
WHEN NOT MATCHED THEN
	INSERT(COLORNO, COLORNM, FLAG1) VALUESE(10, '빨강', '1') ;

 

위 쿼리문을 통해서 살펴보게 되면,

MA_COLOR 테이블에 COLORNO = '10'에 만족하는 값이 있으면 UPDATE / 없으면 INSERT 합니다.

   > 위 쿼리문에서 변수를 사용하면, 좀 더 이해하기 수월할 거에요.

 

 

대충 감은 잡으셨나요~?

 

그러면, 아래 쿼리를 통해 3가지 방법을 통해 더 자세히 알아보겠습니다.

 

 

1. GUBUN, COLORNO 컬럼을 기준으로 #TEMP_B와 #TEMP_A에 동일한 값이 존재하지 않고,

#TEMP_B에서 STATUS(상태) 컬럼의 값이 '정상'일 경우 해당 데이터를 #TEMP_A에 INSERT 합니다.

INSERT INTO #TEMP_A
SELECT B.GUBUN, B.COLORNO, B.COLORNM, B.PRICE
FROM #TEMP_A A
    RIGHT JOIN #TEMP_B B ON A.GUBUN = B.GUBUN AND A.COLORNO = B.COLORNO 
WHERE A.구분 IS NULL
    AND B.STATUS = '정상'

 

 

2. GUBUN, COLORNO 컬럼을 기준으로 #TEMP_B와 #TEMP_A에 동일한 값이 존재하고,

#TEMP_B에서 사유컬럼의 값이 '폐기' 일 경우 해당하는 #TEMP_A  테이블에서 데이터 구분명을
'폐기한' + 기존 구분명으로 UPDATE 합니다.

UPDATE #TEMP_A SET GUBUN = '폐기한 ' + A.GUBUN
FROM #TEMP_A A
INNER JOIN
(
	SELECT B.GUBUN, B.COLORNO, B.COLORNM
    FROM #TEMP_A A
    	RIGHT JOIN #TEMP_B B ON A.GUBUN = B.GUBUN AND A.COLORNO = B.COLORNO
    WHERE A.GUBUN IS NOT NULL
    	AND B.STATUS = '폐기'
) B ON A.GUBUN = B.GUBUN AND A.COLORNO = B.COLORNO AND A.PRICE = B.PRICE

 

 

 

3. 분류와 제품 컬럼을 기준으로 #TEMP_B와 #TEMP_A에 동일한 값이 존재하고,

#TEMP_B에서 STATUS 컬럼 값이 '반품' 일 경우 #TEMP_A의 해당 데이터를 DELETE 합니다.

DELETE #TEMP_A FROM #TEMP_A A
INNER JOIN
(
	SELECT B.GUBUN, B.COLORNO, B.COLONM, B.PRICE
    FROM #TEMP_A A
    	RIGHT JOIN #TEMP_B B ON A.GUBUN = B.GUBUN AND A.COLORNO = B.COLORNO
    WHERE A.GUBUN IS NOT NULL
    	AND B.STATUS = '반품'
) B ON A.GUBUN = B.GUBUN AND A.COLORNO = B.COLORNO AND A.PRICE = B.PRICE

 

 

   ㅡ> 이를 토대로 3개 쿼리를 MERGE 구문으로 정리해볼까요?!

MERGE #TEMP_A AS A

-- GUBUN, COLORNO 컬럼 기준 비교
USING (SELECT STATUS, GUBUN, COLORNO, COLORNM, PRICE FROM #TEMP_B) AS B
ON (A.GUBUN = B.GUBUN AND A.COLORNO = B.COLORNO)

-- 1. GUBUN 컬럼, COLORNO 컬럼 값이 일치한 행이 존재하지 않고, 해당 행의 STATUS 컬럼의 값이 '정상'일 경우
WHEN NOT MATCHED AND B.STATUS = '정상' THEN
	INSERT (GUBUN, COLORNO, COLORNM, PRICE) VALUES (B.GUBUN, B.COLORNO, B.COLORNM, B.PRICE)

-- 2. GUBUN 컬럼, COLORNO 컬럼 값이 일치한 행이 존재하고, 해당 행의 STATUS 컬럼의 값이 '폐기'일 경우
WHEN MATCHED AND B.STATUS = '폐기' THEN
	UPDATE SET GUBUN = ('폐기한 ' + B.GUBUN)
    
-- 3. GUBUN 컬럼, COLORNO컬럼 값이 일치한 행이 존재하고, 해당 행의 STATUS 컬럼의 값이 '반품'일 경우
WHEN MATCHED AND B.STAUTS = '반품' THEN
DELETE;

 

위의 쿼리를 실행하면, 다음과 같은 결과가 출력됩니다.

  GUBUN(구분) COLORNO COLORNM PRICE
1 마우스 1 RED 2,000
2 폐기한 마우스 2 BLACK 15,000
3 모니터 3 WHITE 20,000

 

 


 

이번엔 MERGE 구문에 대해서 알아보았는데요.

조건에 따라 INSERT / UPDATE / DELETE를 모두 적용할 수 있는 구문이고, 활용법도 다양하다고 생각됩니다.🙌

 

 

특히, 전자문서 EDI나 연동할 경우에 많이 활용할 수 있어요~!

잘 익혀두고, 적용할 수 있도록 합시다!!

 

화이팅.

 

댓글(0)

Designed by JB FACTORY