반응형

오라클의 Merge문은 앞서 배운 

Insert문과 Update문을 한꺼번에 수행할 수 있는 기능입니다.

 

기본 로직은 어떠한 값을 특정 테이블에 저장하려 할 때

저장하려는 값이 존재하지 않으면 Insert , 존재하면 Update를

수행하게 하는 역할을 합니다.

 

MERGE INTO 구조

MERGE INTO [테이블A] 
USING [테이블B]
   ON ([테이블A].[컬럼1] = [테이블B].[컬럼1]) 
 WHEN MATCHED THEN 
	  UPDATE 
	     SET [테이블A].[컬럼] = [값1] 
 WHEN NOT MATCHED THEN 
	  INSERT ([테이블A].[컬럼1], [테이블A].[컬럼2]) VALUE([값1], [값2])

기본 구조는 위와 같습니다.

기능 역할
MERGE INTO  Insert, Update 문이 수행될 테이블A
USING MERGE INTO에 해당된 테이블과 비교할 테이블B
ON 테이블A와 테이블B에 매칭할 컬럼
WHEN MATCHED THEN ON절에 해당 하는 데이터가 이미 있을 경우
WHEN NOT MATCHED THEN ON절에 해당 하는 데이터가 없을 경우

Merge문의 구조는 위와 같은 형태를 띠고 있습니다.

 

예제 소스

EMP 테이블을 예제로 사용할 예정이며,

EMP_TARGER 테이블을 새로 생성하여 Merge 해 보겠습니다.

 

EMP_TARGET 테이블에는 연봉이 2000 이하의 데이터가 있습니다.

이 테이블에는 EMP테이블에 있는 사원도 없는 사원도 있습니다.

 

그래서 MERGE문을 수행해서 EMP테이블에 존재하는 사원이면

연봉을 +1000 더하고 없으면 EMP테이블에 저장해 보겠습니다.

EMP테이블과 EMP_TARGET 테이블 조회 모습입니다.

 

MERGE INTO EMP EP
     USING EMP_TARGET ET
        ON (EP.EMPNO = ET.EMPNO)
  WHEN MATCHED THEN 
	  UPDATE SET EP.SAL = EP.SAL + 1000
 WHEN NOT MATCHED THEN 
	  INSERT (EMPNO, ENAME, JOB, MGR, 
              HIREDATE, SAL, COMM, DEPTNO) 
      VALUES (ET.EMPNO, ET.ENAME, ET.JOB, ET.MGR, 
              ET.HIREDATE, ET.SAL, ET.COMM, ET.DEPTNO);

MERGE문을 수행한 모습입니다.

 

EMP_TARGET의 명단이 EMP테이블에 존재하면 연봉이 올랐으며

없으면 EMP테이블에 저장된 모습입니다.

 

MERGE 문은 JAVA의 IF - ELSE와 같은  효과를 누릴 수 있는데요.

 

INSERT와 UPDATE를 동시에 쓸 수 있으므로 소스의 간결함이 필요할 때

쓰시면 유용하게 사용할 수 있습니다.

반응형

+ Recent posts