Come aggiornare una tabella da un'altra tabella


28

Ho una tabella A con colonna (id, field_1, field_2) e un'altra tabella B con colonna (id, field_2)

Ora voglio unire la tabella B in A, ciò significa che voglio aggiornare field_2 nella tabella A al valore della tabella B. Quindi, come implementarlo? A proposito sto usando Oracle

Grazie


Entrambe le tabelle contengono lo stesso numero di record?
ujjwalesri,

Risposte:


29

Un approccio alternativo alla sottoquery correlata (suggerita da Kerri) sarebbe quello di utilizzare l'istruzione MERGE, che potrebbe essere più efficiente della sottoselezione (che può essere verificata solo guardando il piano di esecuzione di entrambe le istruzioni).

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
L'unica limitazione MERGEall'istruzione è che non è possibile aggiornare la colonna a cui è unita, ovvero non è possibile aggiornare la colonna utilizzata nella ONclausola.
Lalit Kumar B,

Questo ha funzionato per me, aggiornato 2,5 milioni di righe rispetto al tentativo del metodo di query secondaria che è durato forse 45 minuti prima di ORA-01555: snapshot too old
commettere errori

15

Non sono esattamente sicuro di cosa stai cercando in questo, ma questo dovrebbe funzionare come una tantum o continuo tramite un lavoro programmato:

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

Ora, ogni volta che viene eseguito quanto sopra, lo farà su tutte le righe della tabella. Se questo è qualcosa che devi fare sempre, suggerirei qualcos'altro, ma per un tavolo unico o molto piccolo dovrebbe essere sufficiente.


2

L'ho fatto con successo usando una tabella in user1 da un'altra tabella in 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>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.