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


28

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

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

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


Обе таблицы содержат одинаковое количество записей?
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

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>

1

Вы можете создать триггер на tableB, который обновляет tableA каждый раз, когда field_2 на tableB обновляется. Проверьте здесь для получения дополнительной информации о создании триггеров - http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm#BABCIBBJ


Не релевантный ответ
CleanBold
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.