Как обновить таблицу из другой таблицы

28

У меня в одной таблице A есть столбец (id, field_1, field_2), а в другой таблице B есть столбец (id, field_2)

Теперь я хочу объединить таблицу B с A, это означает, что я хочу обновить field_2 в таблице A до значения таблицы B. Так как это реализовать? Кстати, я использую оракул

Благодарность

zjffdu
источник
Обе таблицы содержат одинаковое количество записей?
ujjwalesri

Ответы:

29

Альтернативный подход к связанному подзапросу (предложенный Kerri) заключается в использовании оператора MERGE, который может быть более эффективным, чем подвыбор (который можно проверить, только посмотрев план выполнения обоих операторов).

MERGE INTO table_b 
USING 
(
  SELECT id,
         field_2
  FROM table_a
) ta ON (ta.id = table_b.id)
WHEN MATCHED THEN UPDATE 
    SET table_b.field_2 = ta.field_2
a_horse_with_no_name
источник
2
Единственным ограничением для MERGEоператора является то, что вы не можете обновить столбец, к которому он присоединен, т.е. вы не можете обновить столбец, используемый в ONпредложении.
Лалит Кумар B
Это сработало для меня, обновив 2,5 миллиона строк по сравнению с попыткой метода подзапроса, который выполнялся, может быть, за 45 минут до ошибки сORA-01555: snapshot too old
helmy
15

Не совсем уверен, что вы ищете в этом, но это должно работать как разовое или непрерывно через запланированное задание:

UPDATE table_a a
   SET field_2 = ( SELECT field_2
                     FROM table_b b
                    WHERE b.id = a.id )
;

Теперь каждый раз, когда выполняется выше, он будет делать это во всех строках таблицы. Если это то, что вам нужно делать постоянно, я бы предложил что-то другое, но для одноразовых или очень маленьких столов этого должно быть достаточно.

Керри Шоттс
источник
2

Я сделал это успешно, используя одну таблицу в user1 из другой таблицы в user2:

update user1.table1 a
set a.field1 = (
  select b.field1
  from user2.table2 b
  where a.field1=b.field1
)
where <condition for update user1.table1>
Сиддик
источник