Як оновити таблицю з іншої таблиці


28

У мене одна таблиця A має стовпець (id, field_1, field_2), а інша таблиця B має стовпець (id, field_2)

Тепер я хочу об'єднати таблицю B в A, це означає, що я хочу оновити field_2 в таблиці A до значення таблиці B. Так як це реалізувати? До речі, я використовую Oracle

Спасибі


Чи містять обидві таблиці однакову кількість записів?
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пункті.
Лаліт Кумар Б

Це працювало для мене. Оновлено 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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.