특정 테이블의 여러 ROW를 UPDATE 해야하는 업무가 생겼다.

간단하게 SELECT UPDATE 로 처리 하면 끝날 줄 알았던 간단한 작업이, 내 발을 묶어 10시가 넘어서 퇴근하게 되었다


1. 일반 적인 방법을 이용

UPDATE t1 
SET 
       ( 
              column1, 
              column2 
       ) 
       = 
       ( 
                 SELECT    column1 COLUMN 2 
                 FROM      t1 
                 left join t2 
                 ON        t1.a =t2.a 
                 WHERE     ...)

결과 ⇒ 실패


2.Join view 를 이용한 방법

UPDATE 
/*+ bypass-ujvc */ (SELECT a.t1, 
                           a.t2, 
                           b.o1, 
                           b.o2 
                    FROM   a 
                           inner join b 
                                   ON a.colunm = b.colunm 
                    WHERE  a.h = b.h) 
SET    t1 = o1, 
       t2 = o2 

결과 ⇒ 실패


3. Loop를 이용

BEGIN 
    FOR i IN (SELECT id, 
                     name, 
                     desc 
              FROM   table1) LOOP 
        UPDATE table2 
        SET    name = i.name, 
               desc = i.desc 
        WHERE  id = i.id; 
    END LOOP; 
END; 

결과 ⇒ 성공


1, 2 번의 경우는 PK가 WHERE 조건으로 되어야 문제없이 동작을 한다.


PK를 WHERE 조건으로 사용하지 않을 경우 LOOP를 이용한 방법을 이용하면 SELECT UPDATE를 할 수 있다.

Posted by lahuman

댓글을 달아 주세요