ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ORACLE]MERGE INTO USING
    DB 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)

     

    'DB' 카테고리의 다른 글

    [ORACLE]ROWNUM VS FETCH FIRST ROWS사용법  (0) 2022.06.04

    댓글

Designed by Tistory.