Jak zaktualizować tabelę z innej tabeli


28

Mam jedną tabelę A ma kolumnę (id, field_1, field_2), a drugą tabelę B ma kolumnę (id, field_2)

Teraz chcę scalić tabelę B z A, co oznacza, że ​​chcę zaktualizować pole_2 w tabeli A do wartości z tabeli B. Więc jak to zaimplementować? BTW używam Oracle

Dzięki


Czy obie tabele zawierają taką samą liczbę rekordów?
ujjwalesri

Odpowiedzi:


29

Alternatywnym podejściem do powiązanych ze sobą podkwerend (sugerowanych przez Kerri) byłoby użycie instrukcji MERGE, która może być bardziej wydajna niż podselekcja (którą można zweryfikować tylko patrząc na plan wykonania obu instrukcji).

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
Jedynym ograniczeniem MERGEinstrukcji jest to, że nie można zaktualizować kolumny, do której jest przyłączona, tj. Nie można zaktualizować kolumny użytej w ONklauzuli.
Lalit Kumar B

Ten pracował dla mnie, updated 2,5 miliona wierszy w porównaniu z próbą metodę sub-kwerendy, która prowadziła przez jakieś 45 minut przed erroring zORA-01555: snapshot too old
Helmy

15

Nie jestem do końca pewien, o co ci chodzi, ale powinno to działać jako jednorazowe lub ciągłe poprzez zaplanowane zadanie:

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

Teraz, za każdym razem, gdy powyższe zostanie wykonane, zrobi to we wszystkich wierszach w tabeli. Jeśli jest to coś, co musisz cały czas robić, proponuję coś innego, ale w przypadku jednorazowych lub bardzo małych stolików powinno wystarczyć.


2

Zrobiłem to pomyślnie, używając jednej tabeli w user1 z innej tabeli w 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>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.