본문 바로가기
MS SQL

MS SQL_MERGE문 사용법

by 디디찐 2022. 9. 23.
반응형

1. MERGE 란?


하나의 쿼리문으로 데이터 소스와 대상 테이블을 비교해서 데이터를 동기화할 수 있는 기능 제공

 => 조건이 일치하면 UPDATE 혹은 DELETE / 불일치 시 INSERT 를 실행할 수 있는 쿼리


2. MERGE문 사용법


MERGE INTO 변경될 테이블 AS A             테이블의 조건에 따라 UPDATE /DELETE 또는 INSERT 할 테이블
USING 기준 테이블 AS B                           비교할 대상 테이블 (❗별칭 필수)
ON A.키값 = B.키값                                   조건문 
WHEN MATCHED THEN
           키 값 일치 시 실행할 쿼리               변경될 테이블의 행을 UPDATE 혹은 DELETE
WHEN NOT MATCHED THEN
            키 값 불일치 시 실행할 쿼리           변경될 테이블 행에 INSERT
WHEN NOT MATCHED BY SOURCE THEN
            실행할 쿼리                                   변경될 테이블의 행을 UPDATE 혹은 DELETE

; (❗세미클론필수)

 


WHEN MATCHED THEN 

     A 테이블의 ID와 B테이블의 ID를 기준으로 모두 존재하는 경우,

    해당 행은 A 테이블의 행을 UPDATE하거나 DELETE 할 수 있다.

 

WHEN NOT MATCHED THEN

     A 테이블에 존재하지 않지만 B 테이블에 존재하는 경우, 해당 행은 A테이블로 INSERT 만 할 수 있다.

 

WHEN NOT MACHED BY SOURCE

     A 테이블에는 존재하지만 B테이블에 존재하지 않을 경우, A 테이블의 행을 UPDATE하거나 DELETE 할 수 있다.

 

쿼리문 형태

  • UPDATE SET A.컬럼명,.. = B.컬럼명,...
  • DELETE 
  • INSERT (A.컬럼명,...) VALUES (B.컬럼명,...)

3. MERGE문 사용예제

MENU 임시테이블 생성

CREATE TABLE #MENU(
    MENU_ID INT,
    NAME VARCHAR(20),
    PRICE INT
)

INSERT INTO #MENU(MENU_ID, NAME, PRICE) VALUES (10,'김치찌개',10000)
INSERT INTO #MENU(MENU_ID, NAME, PRICE) VALUES (20,'돈까스',9000)
INSERT INTO #MENU(MENU_ID, NAME, PRICE) VALUES (30,'라면',4000)
INSERT INTO #MENU(MENU_ID, NAME, PRICE) VALUES (40,'된장찌개',5000)
INSERT INTO #MENU(MENU_ID, NAME, PRICE) VALUES (50,'계란말이',8000)

FOOD 임시테이블 생성

CREATE TABLE #FOOD(
    FOOD_ID INT,
    NAME VARCHAR(20),
    PRICE INT 
)

INSERT INTO #FOOD(FOOD_ID, NAME, PRICE) VALUES (10,'묵은지 김치찌개',12000)
INSERT INTO #FOOD(FOOD_ID, NAME, PRICE) VALUES (20,'치즈 돈까스',10000)
INSERT INTO #FOOD(FOOD_ID, NAME, PRICE) VALUES (30,'떡 라면',4500)
INSERT INTO #FOOD(FOOD_ID, NAME, PRICE) VALUES (70,'제육볶음',4500)

 

 

MERGE 문 

MERGE #MENU AS M
USING (
    SELECT FOOD_ID,NAME,PRICE 
      FROM #FOOD

) AS F
ON (M.MENU_ID = F.FOOD_ID)
WHEN MATCHED THEN
    UPDATE SET M.MENU_ID = F.FOOD_ID,
               M.NAME = F.NAME,
               M.PRICE = F.PRICE
WHEN NOT MATCHED THEN
    INSERT (MENU_ID,NAME,PRICE)
    VALUES(F.FOOD_ID,F.NAME,F.PRICE)
WHEN NOT MATCHED BY SOURCE AND M.MENU_ID =50 THEN 
     DELETE ;

반응형