sql - with - update table oracle




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

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;

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.


Questo è chiamato un aggiornamento correlato

UPDATE table1 t1
   SET (name, desc) = (SELECT t2.name, t2.desc
                         FROM table2 t2
                        WHERE t1.id = t2.id)
 WHERE EXISTS (
    SELECT 1
      FROM table2 t2
     WHERE t1.id = t2.id )

Supponendo che i risultati del join in una vista conservata con chiave, si potrebbe anche

UPDATE (SELECT t1.id, 
               t1.name name1,
               t1.desc desc1,
               t2.name name2,
               t2.desc desc2
          FROM table1 t1,
               table2 t2
         WHERE t1.id = t2.id)
   SET name1 = name2,
       desc1 = desc2

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, ...

provare

UPDATE Table1 T1 SET
T1.name = (SELECT T2.name FROM Table2 T2 WHERE T2.id = T1.id),
T1.desc = (SELECT T2.desc FROM Table2 T2 WHERE T2.id = T1.id)
WHERE T1.id IN (SELECT T2.id FROM Table2 T2 WHERE T2.id = T1.id);

Update table set column = (select...)

non ha mai funzionato per me poiché il set si aspetta solo un valore - Errore SQL: ORA-01427: la sottoquery a riga singola restituisce più di una riga.

ecco la soluzione:

BEGIN
For i in (select id, name, desc from table1) 
LOOP
Update table2 set name = i.name, desc = i.desc where id = i.id;
END LOOP;
END;

È esattamente come lo si esegue sul foglio di lavoro di SQLDeveloper. Dicono che è lento, ma questa è l'unica soluzione che ha funzionato per me in questo caso.







sql-update