DB

[ORACLE]MERGE INTO USING

도비는자유에오 2022. 6. 5. 16:21

회사에서 요즘 회원 이벤트 구축 파트를 개발하고 있다.

업권별(EX.카드연결, 계좌연결 등등)로 이벤트를 참여 여부를 체크했는데, 안했을 때는 INSERT를 해서 이벤트 참여를 시키고 이미 참여했을 경우  UPDATE문으로 사용여부를 N으로 바꾸도록 했는데, 이 문제를 MERGE INTO를 사용하여 간단하게 개발하였다. 

 

아래 코드는 회사 소스가 공유 불가능 하여 예시로 만들어 보았다.

 

SELECT 를 했을때 데이터가 없을 때 INSERT , 데이터가 있을 때 UPDATE 를 사용한다.  

MERGE INTO[TABLE/VIEW]
USING [TABLE/VIEW/DUAL] --비교할 테이블 OR 뷰 (MERGE INTO 절의 테이블OR뷰와 동일 할 경우 DUAL 사용)
   ON [조건] --UPDATE와 INSERT를 처리할 조건문(일치하면 UPDATE , 불일치 INSERT)
 WHEN MATCHED THEN	--일치하는 경우(UPDATE|DELETE)
 		UPDATE SET
        	      [COLUMN1] = [VALUE1]
        	      [COLUMN2] = [VALUE2]
       (DELETE [TABLE] WHERE [COLUMN1] = [VALUE1] AND ...) -- DELETE 구문도 사용가능(단,오라클 10g 이상부터)
WHEN NOT MATCHED THEN --불일치하는 경우 INSERT
		INSERT(COLUMN1, COLUMN2,...)
        VALUES(VALUE1, VALUE2,...)

예제1) 같은 테이블 비교 후 MERGE INTO (DUAL 사용)

MERGE INTO emp A
	 USING DUAL
       ON (A.empNo = '1004') --EMP테이블에 회원번호에 1004가 있으면	
WHEN MATCHED THEN --일치할 경우
 	UPDATE
       SET A.modiDate = SYSDATE -- 수정일 컬럼을 현재날짜로 UPDATE
WHEN NOT MATCHED THEN
	INSERT(A.name, A.empno,A.regDate)
    VALUES(1234,'DOBBY',SYSDATE);

2) 서로 다른 테이블 비교 후(서브쿼리)  MERGE INTO

MERGE INTO emp A
	 USING(SELECT AA.empNo --emp테이블과 dept 테이블에 empNO 1004번과 depNO가 서로 같은 조건
                  ,AA.job
                  ,AA.deptNo
     		 FROM emp AA
             	  ,dept BB
            WHERE AA.empNo = '1004' 
              AND AA.deptNo = BB.deptNo) B
       ON(A.empNo = B.empNo)
WHEN MATCHED THEN --일치 시 emp 테이블에 dept 테이블에 있는 deptNo, job컬럼 데이터를 UPDATE 시킨다.
	 UPDATE SET A.deptNo = B.deptNo
         		,A.job = B.job
WHEN NOT MATCHED THEN --불일치 시 emp 테이블에 데이터를 INSERT
	 INSERT(A.empNo, A.job, A.deptNo)
     VALUES(B.empNo, B.job, B.deptNo)