자기 개발/Oracle

오라클(ORACLE) MERGE INTO (UPDATE , INSERT)

SeungHwa 2014. 5. 30. 15:30

프로젝트 할때 자주 데이터 삽입 과 데이터 수정을 자주 하게 됩니다.
그럴때 없는 데이터 같은경우는 INSERT(삽입)을 통해 데이터를 넣어주고 , 있을 경우에는 
데이터 변경이 필요할때 UDPATE(수정)를 통해 작업을 해주는데 조건문을 통해 성립 할경우 와 안할경우 
일반적인 IF문을 사용할때는 아래와 같이 써주게 됩니다. 


/* PL/SQL에서 사용하는 일반적인 IF문 */
  
IF 조건1 = TRUE THEN
  UPDATE 쿼리
ELSE
  INSERT 쿼리
END IF;
-------------------------------------------------------------------------------------------------

하지만 MERGE INTO 문을 사용하게 되면 아래 와 같이 조건문으로 처리를 안해도 한 문장에 쿼리로 삽입 과 수정을 할 수있습니다.


* MERGE INTO 예문 1
  
MERGE INTO USER_MASTER UM  -- Table
USING
(
  SELECT UI.USER_ID, UI.USER_NAME, UI.NO, UG.GROUP_NAME
    FROM USER_MASTER_IMPORT UI 
      LEFT JOIN USER_GROUP UG ON UI.USER_ID = UG.USER_ID
) UI  -- Target table
ON (UM.USER_ID = UI.USER_ID)  -- 대상테이블(Target table)과의 JOIN 조건
  
-- 조건이 일치할 경우
WHEN MATCHED THEN
UPDATE SET USER_NAME = USER_MASTER_IMPORT.USER_NAME
  
-- 일치하지 않을 경우(10G에서 사용이 안될 경우도 있습니다.)
WHEN NOT MATCHED THEN
INSERT (USER_ID, USER_NAME, NO, GROUP_NAME)  --INSERT 시 INTO를 사용하지 않음에 주의
VALUES (UI.USER_ID, UI.USER_NAME, UI.NO, UI.GROUP_NAME)


-------------------------------------------------------------------------------------------------


/* MERGE INTO 예문2 
  
MERGE INTO TABLE_NAME TBL1
  USING TARGET_TABLE TABL2  -- 동일한 테이블일 경우 TARGET_TABLE을 DUAL로 지정
  ON TBL1.COLUMN_NAME = TABL2.COLUMN_NAME  -- 두 테이블을 JOIN하는 조건문
WHEN MATCHED THEN  --조건에 맞을 경우
    UPDATE SET COL1 = VAL1
                       ,COL2 = VAL2
                       ,COL3 = VAL3
WHEN NOT MATCHED THEN  --조건에 맞지 않을 경우
    INSERT(COL1, COL2, COL3)
    VALUES(VAL1, VAL2, VAL3)