Comment mettre à jour une table à partir d'une autre table


28

J'ai une table A a une colonne (id, field_1, field_2), et une autre table B a une colonne (id, field_2)

Maintenant, je veux fusionner la table B en A, cela signifie que je veux mettre à jour field_2 dans la table A à la valeur de la table B. Alors, comment implémenter cela? BTW j'utilise oracle

Merci


Les deux tableaux contiennent-ils le même nombre d'enregistrements?
ujjwalesri

Réponses:


29

Une approche alternative à la sous-requête associée (suggérée par Kerri) serait d'utiliser l'instruction MERGE, qui pourrait être plus efficace que la sous-sélection (qui ne peut être vérifiée qu'en regardant le plan d'exécution des deux instructions).

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
La seule restriction à l' MERGEinstruction est que vous ne pouvez pas mettre à jour la colonne sur laquelle elle est jointe, c'est-à-dire que vous ne pouvez pas mettre à jour la colonne utilisée dans la ONclause.
Lalit Kumar B

Cela a fonctionné pour moi, mis à jour 2,5 millions de lignes par rapport à tenter la méthode sous-requête qui a duré peut - être 45 minutes avant erroring avecORA-01555: snapshot too old
helmy

15

Vous ne savez pas exactement ce que vous recherchez sur celui-ci, mais cela devrait fonctionner de manière ponctuelle ou continue via un travail planifié:

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

Maintenant, chaque fois que ce qui précède est exécuté, il le fera sur toutes les lignes du tableau. Si c'est quelque chose que vous devez faire tout le temps, je suggérerais autre chose, mais pour des tables uniques ou très petites, cela devrait être suffisant.


2

J'ai fait cela avec succès en utilisant une table dans user1 à partir d'une autre table dans 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>

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.