[MSSQL] MERGE 구문 설명 및 사용법 (데이터 입력/수정/삭제)
- DB/MS SQL
- 2021. 4. 18.
이번 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나 연동할 경우에 많이 활용할 수 있어요~!
잘 익혀두고, 적용할 수 있도록 합시다!!
화이팅.
'DB > MS SQL' 카테고리의 다른 글
[MSSQL] INSERT INTO SELECT문 및 SELECT INTO문 차이점 (0) | 2021.09.01 |
---|---|
[MSSQL] CASE WHEN 및 IF문 설명 및 사용법(조건문) (0) | 2021.04.05 |
[MSSQL] #2 EXISTS, NOT EXISTS문 설명 및 사용법 (3) | 2021.03.28 |
[MSSQL] #1 IN, NOT IN 구문 설명 및 사용법(오류 케이스) (1) | 2021.03.25 |
[MSSQL] 데이터 형태 변환 CONVERT / CAST 함수 설명 및 사용법 (0) | 2021.03.21 |