참고 : http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_9016.htm


테이블에서 어느 조건을 만족하는 데이터(행)가 있다면 Update 없으면 Insert 하는 구문을 한번에 해결 할 수 있다.

Merge Into 사용전 방법 : 
    레코드 존재유무 조회(Select) -> 있음 -> Update
                                             -> 없음 -> Delete

샘플.
 MERGE INTO bonuses D
   USING (SELECT employee_id, salary, department_id FROM employees
   WHERE department_id = 80) S
   ON (D.employee_id = S.employee_id)
   WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
     DELETE WHERE (S.salary > 8000)
   WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
     VALUES (S.employee_id, S.salary*.01)
     WHERE (S.salary <= 8000);

MERGE INTO 테이블(뷰) : 대상 테이블(뷰). Update, Delete, Insert 를 하게 될 테이블(뷰)
USING 테이블(뷰/서브쿼리) : 비교 테이블(뷰/서브쿼리).
ON : 비교 조건
WHEN MATCHED THEN UPDATE [DELETE] : 비교조건에 만족하는 레코드가 있을 경우 해당 레코드에 대해 실행
     10G부터는 DELETE도 포함되었으며 UPDATE문 없이 단독으로 사용하지 못한다.
WHEN NOT MATCHED THEN INSERT : 비교조건에 만족하지 않았을 경우 실행


 var DateUtil = {
  dateFmt: function(date) {
   var rDate = date;
   if (typeof(rDate) == 'string') {
    if(this.dateGubun) {
     var sDate = rDate.split(this.dateGubun);
     if(sDate.length == 3) {
      rDate = new Date(sDate[0], parseInt(sDate[1], 10)-1, sDate[2]);
     }
    } else {
     rDate = new Date(rDate.substr(0,4), parseInt(rDate.substr(4,2), 10)-1, rDate.substr(6,2));
    }
   }
   return rDate;
  },
     diffDays: function(d1, d2, dateGubun) {
      this.dateGubun = dateGubun;
         var t2 = this.dateFmt(d2).getTime();
         var t1 = this.dateFmt(d1).getTime();
 
//          return parseInt((t2-t1)/(24*3600*1000), 10);
   return Math.floor((t2-t1)/(24*3600*1000));
     },  
     diffWeeks: function(d1, d2, dateGubun) {
      this.dateGubun = dateGubun;
         var t2 = this.dateFmt(d2).getTime();
         var t1 = this.dateFmt(d1).getTime();
 
         return parseInt((t2-t1)/(24*3600*1000*7), 10);
     },
     diffMonths: function(d1, d2, dateGubun) {
      this.dateGubun = dateGubun;
         var d1Y = this.dateFmt(d1).getFullYear();
         var d2Y = this.dateFmt(d2).getFullYear();
         var d1M = this.dateFmt(d1).getMonth();
         var d2M = this.dateFmt(d2).getMonth();
 
         return (d2M+12*d2Y)-(d1M+12*d1Y);
     },
     diffYears: function(d1, d2, dateGubun) {
      this.dateGubun = dateGubun;
         return this.dateFmt(d2).getFullYear()-this.dateFmt(d1).getFullYear();
     }
 };
 alert( DateUtil.diffYears('20101027', '20110312') );
 alert( DateUtil.diffYears('2010-10-27', '2011-03-12', '-') );
 alert( DateUtil.diffMonths('20101027', '20110312') );
 alert( DateUtil.diffDays('20110228', '20110328') );

+ Recent posts