티스토리 뷰

Database/Oracle

[oracle] merge into 구문

데브포유 2008. 10. 28. 18:03
반응형
▶merge into 구문

MERGE INTO target_table_name
   USING (table|view|subquery) ON (join condition)
WHEN MATCHED THEN
  UPDATE SET col1 = val1[, col2 = val2…]
WHEN NOT MATCHED THEN
  INSERT(...) VALUES(...)


◈ syntax 설명
- INTO : DATA가 UPDATE되거나 INSERT될 TABLE이름을 지정 합니다.

- USING : 대상 TABLE의 DATA와 비교한 후 UPDATE 또는 INSERT할 대상이 되는 DATA의 SOURCE 테이블 또는 뷰를 지정
- ON  : UPDATE나 INSERT를 하게 될 조건으로, 해당 condition을 만족하는 DATA가 있으면 WHEN MATCHED 절을 실행하게 되고, 없으면 WHEN NOT MATCHED 이하를 실행하게 됩니다.

- WHEN MATCHED : ON 조건절이 TRUE인 ROW에 수행 할 내용

- WHEN NOT MATCHED
: ON 조건절에 맞는 ROW가 없을 때 수행할 내용

-sample sql
MERGE INTO giro_detail a
USING (select GD_USER_ID,GD_TRADE_TYPE,GD_JONG_MOK,GD_NUMBER,GD_DONG_CD,GD_SND_AREA_CD,GD_DETAIL_ADDRESS,GD_ZIP,
             GD_ACNT_NO,GD_ACNTER_NAME,GD_ACNTER_TYPE_CD,GD_ACNTER_TYPE_NO,GD_BANK_CD,GD_DUMMY_FLAG from GIRO_DETAIL_TEMP) b
ON (a.gd_user_id = b.gd_user_id)
WHEN MATCHED THEN
   UPDATE SET                    
           a.GD_TRADE_TYPE=     b.GD_TRADE_TYPE,          
           a.GD_JONG_MOK=       b.GD_JONG_MOK,          
           a.GD_NUMBER=         b.GD_NUMBER,          
           a.GD_DONG_CD=        b.GD_DONG_CD,          
           a.GD_SND_AREA_CD=    b.GD_SND_AREA_CD,        
           a.GD_DETAIL_ADDRESS= b.GD_DETAIL_ADDRESS,      
           a.GD_ZIP=            b.GD_ZIP,          
           a.GD_ACNT_NO=        b.GD_ACNT_NO,          
           a.GD_ACNTER_NAME=    b.GD_ACNTER_NAME,        
           a.GD_ACNTER_TYPE_CD= b.GD_ACNTER_TYPE_CD,      
           a.GD_ACNTER_TYPE_NO= b.GD_ACNTER_TYPE_NO,      
           a.GD_BANK_CD=        b.GD_BANK_CD      
                   
WHEN NOT MATCHED THEN
   INSERT (a.GD_USER_ID,      
           a.GD_TRADE_TYPE,    
           a.GD_JONG_MOK,      
           a.GD_NUMBER,        
           a.GD_DONG_CD,      
           a.GD_SND_AREA_CD,  
           a.GD_DETAIL_ADDRESS,
           a.GD_ZIP,          
           a.GD_ACNT_NO,      
           a.GD_ACNTER_NAME,  
           a.GD_ACNTER_TYPE_CD,
           a.GD_ACNTER_TYPE_NO,
           a.GD_BANK_CD,      
           a.GD_DUMMY_FLAG)  
   VALUES(
            b.GD_USER_ID,          
            b.GD_TRADE_TYPE,        
            b.GD_JONG_MOK,          
            b.GD_NUMBER,            
            b.GD_DONG_CD,          
            b.GD_SND_AREA_CD,      
            b.GD_DETAIL_ADDRESS,    
            b.GD_ZIP,              
            b.GD_ACNT_NO,          
            b.GD_ACNTER_NAME,      
            b.GD_ACNTER_TYPE_CD,    
            b.GD_ACNTER_TYPE_NO,    
            b.GD_BANK_CD,          
            b.GD_DUMMY_FLAG);
     



SQL>MERGE INTO emp_test et
 USING emp e
 ON(et.empno = e.empno)
WHEN MATCHED THEN
 UPDATE SET et.sal = e.sal*1.1
WHEN NOT MATCHED THEN
 INSERT VALUES (e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptno)

MERGE INTO  AAAAA A
USING(SELECT EMP_NO, AUTH_CD
   FROM  BBBBB
   WHERE EMP_NO = p_emp_no
   AND AUTH_CD = p_auth_cd) B
ON (A.EMP_NO = B.EMP_NO AND A.AUTH_CD = B.AUTH_CD)
WHEN MATCHED THEN
   UPDATE
   SET  A.REG_DATE = SYSDATE
        , A.REG_EMP_NO = p_reg_emp_no
WHEN NOT MATCHED THEN
   INSERT (A.EMP_NO, A.AUTH_CD, A.MNGER_YN, A.REG_DATE, A.REG_EMP_NO)
   VALUES (p_emp_no, p_auth_cd, 'N',SYSDATE,p_reg_emp_no);

반응형