Oracle SQL: aggiorna una tabella con i dati di un'altra tabella



Answers

Prova questo:

MERGE INTO table1 t1
USING
(
-- For more complicated queries you can use WITH clause here
SELECT * FROM table2
)t2
ON(t1.id = t2.id)
WHEN MATCHED THEN UPDATE SET
t1.name = t2.name,
t1.desc = t2.desc;
Question

Tabella 1:

id    name    desc
-----------------------
1     a       abc
2     b       def
3     c       adf

Tavolo 2:

id    name    desc
-----------------------
1     x       123
2     y       345

In Oracle Oracle, come posso eseguire una query di aggiornamento SQL che può aggiornare la Tabella 1 con il name e la desc della Tabella 2 utilizzando lo stesso id ? Quindi il risultato finale che otterrei è

Tabella 1:

id    name    desc
-----------------------
1     x       123
2     y       345
3     c       adf

La domanda viene presa dall'aggiornamento di una tabella con i dati di un'altra , ma in particolare per Oracle Oracle.




Qui sembra essere una risposta ancora migliore con la clausola 'in' che consente più chiavi per il join :

update fp_active set STATE='E', 
   LAST_DATE_MAJ = sysdate where (client,code) in (select (client,code) from fp_detail
  where valid = 1) ...

L'esempio completo è qui: http://forums.devshed.com/oracle-development-96/how-to-update-from-two-tables-195893.html

Il manzo consiste nell'avere le colonne che si desidera utilizzare come la chiave tra parentesi nella clausola where prima di "in" e avere l'istruzione select con gli stessi nomi di colonna tra parentesi. dove ( colonna1, colonna2 ) in ( selezionare ( colonna1, colonna2 ) dalla tabella in cui "l'insieme si desidera" );




Se la tua tabella t1 e il suo backup t2 hanno molte colonne, ecco un modo compatto per farlo.

Inoltre, il mio problema correlato era che solo alcune delle colonne erano state modificate e molte righe non avevano modifiche a queste colonne, quindi volevo lasciarle in pace - fondamentalmente ripristinare un sottoinsieme di colonne da un backup dell'intera tabella. Se vuoi semplicemente ripristinare tutte le righe, salta la clausola where.

Naturalmente il modo più semplice sarebbe quello di eliminare e inserire come selezionare, ma nel mio caso avevo bisogno di una soluzione con solo aggiornamenti.

Il trucco è che quando si seleziona * da una coppia di tabelle con nomi di colonne duplicati, il secondo otterrà il nome _1. Quindi ecco cosa mi è venuto in mente:

  update (
    select * from t1 join t2 on t2.id = t1.id
    where id in (
      select id from (
        select id, col1, col2, ... from t2
        minus select id, col1, col2, ... from t1
      )
    )
  ) set col1=col1_1, col2=col2_1, ...





Related