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

zjffdu
źródło
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
koń bez imienia
źródło
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ć.

Kerri Shotts
źródło
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>
Siddik
źródło