2017-01-13 2 views
0

동일한 테이블에서 여러 열을 업데이트해야합니다. 그러나 업데이트해야하는 값은 다른 테이블에서 가져옵니다. 현재 업데이트 문을 구분했습니다. 문제는 많은 업데이트 문을 업데이트하고 실행하는 열이 많아서 많은 수의 잠금 및 성능 문제를 일으키는 것입니다.값이 다른 테이블의 여러 열을 업데이트 - Oracle

하나의 업데이트 문에 결합 할 수있는 방법이 있습니까? 다음은 UPDATE 문 내 목록에서 두 가지 예는 지금이 :

UPDATE table1 t1 
    SET t1.col1 = (
      SELECT col7 
       FROM table1 t1b, table2 t2 
      WHERE t1b.col2 = t2.col2 
       AND t1b.col3 = t2.col3 
       AND t1b.col2 = t1.col2) 
    WHERE t1.col4 = 0 
    AND t1.col2 IN (SELECT col2 FROM table2); 


    UPDATE table1 t1 
    SET t1.col5 = (
      SELECT col6 
       FROM table1 t1c, table3 t3 
      WHERE t1c.col2 = t3.col2 
       AND t1c.col3 = t3.col3 
       AND t1c.col2 = t1.col2) 
    WHERE t1.col4 = 0 
    AND t1.col2 IN (SELECT col2 FROM table3); 

답변

1

병합이 작업을 수행해야한다 : 이것은 당신의 문에 약간 다른 것을

merge into table1 tg 
using (
    SELECT t1.col2, t1.col3, 
     col7 
     col6 
    FROM table1 t1 
    JOIN table2 t2 ON t1.col2 = t2.col2 
        AND t1.col3 = t2.col3 
    JOIN table3 t3 ON t1.col2 = t3.col2 
        AND t1.col3 = t3.col3 
) x ON (x.col2 = tg.col2 and x.col3 = tg.col3) 
when matched then update 
    set col1 = x.col7, 
     col5 = x.col6; 

참고가 모두 참여한다고 가정으로 to table2 및 table3은 성공적입니다. 맞지 않으면 (내부) 조인을 왼쪽 (외부) 조인으로 변경하십시오.

+0

답변 해 주셔서 감사합니다. 조인을 왼쪽 조인으로 변경했지만 올바른 결과를 얻지 못했습니다. WHERE 절에서이 조건을주의하십시오. AND t1.col2 IN (SELECT col2 FROM table3); AND t1.col2 IN (SELECT col2 FROM table2); table2와 table3에 table1 조인의 모든 항목이 필요하지만 table2와 table3에있는 레코드 만 업데이트하려고합니다. – autumn

+0

"*하지만 table2와 table3 *에있는 레코드 만 업데이트하려고합니다."- 그러면 필요합니다. 내부 조인이 아닌 외부 조인 –

+0

하지만 table1에서 table3까지 모든 항목을 조인해야합니다. JOIN을 사용하면 table1 조인 결과 table2 조인을 table3에 조인하는 대신 table3에서 table3으로 모두 조인하지 않고 – autumn