2017-01-13 6 views
0

Мне нужно обновить несколько столбцов в одной таблице. Однако значения, которые мне нужно обновить, поступают из разных таблиц. В настоящее время у меня есть инструкции по обновлению. Проблема в том, что у меня много столбцов для обновления и запуска многих операторов обновлений, что вызывает много ошибок и проблем с производительностью.Обновление нескольких столбцов, где значения из разных таблиц - Oracle

Есть ли способ, чтобы я мог объединить их в один оператор обновления? Этих два примера из моего списка операторов обновления я сейчас:

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; 

Обратите внимание, что это немного отличается от ваших высказываний, как он предполагает, что оба присоединиться к таблице 2 и таблице 3 успешны. Если это не так, меняются (внутренние) соединения на левое (внешнее) соединение.

+0

Благодарим за отзыв. Я изменил соединения на левые соединения, но это не дало мне правильных результатов. Обратите внимание на это условие в моих предложениях WHERE: И t1.col2 IN (SELECT col2 FROM table3); и AND t1.col2 IN (SELECT col2 FROM table2); Мне нужно все в таблице1 присоединяться к table2 и table3, но я хочу только обновить записи, которые существуют в таблице2 и таблице3 – autumn

+0

«*, но я хочу только обновить записи, которые существуют в таблице2 и таблице3 *», - тогда вам нужно внутреннее соединение не является внешним соединением –

+0

, но мне нужно объединить все в таблице1 в таблицу3, если я использую JOIN, он присоединится к результатам таблицы1, присоединив table2 к таблице3, а не присоединяется ко всему в таблице1 к таблице3. – autumn

Смежные вопросы