web-dev-qa-db-fra.com

Oracle SQL: mettre à jour une table avec les données d'une autre table

Tableau 1:

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

Tableau 2:

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

Dans Oracle SQL, comment puis-je exécuter une requête SQL update capable de mettre à jour la table 1 avec name et desc de la table 2 à l'aide de le même id? Donc, le résultat final que je voudrais obtenir est

Tableau 1:

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

La question provient de met à jour une table avec les données d'une autre , mais spécifiquement pour Oracle SQL.

218
Muhd

Ceci s'appelle une mise à jour corrélée

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 )

En supposant que les résultats de la jointure soient dans une vue préservée par la clé, vous pouvez également:

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
459
Justin Cave

Essaye ça:

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;
91
Adrian

essayer

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);
17
Yahia
Update table set column = (select...)

cela n'a jamais fonctionné pour moi car l'ensemble n'attend qu'une valeur - Erreur SQL: ORA-01427: la sous-requête à une seule ligne retourne plus d'une ligne.

voici la solution:

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;

C'est exactement comment vous l'exécutez sur la feuille de travail SQLDeveloper. Ils disent que c'est lent mais c'est la seule solution qui a fonctionné pour moi dans cette affaire.

7
Pau Karr

Cela semble être une réponse encore meilleure avec la clause 'in' qui permet plusieurs clés pour la jointure :

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

L'exemple complet est ici: http://forums.devshed.com/Oracle-development-96/how-to-update-from-two-tables-195893.html

Le boeuf est d'avoir les colonnes que vous voulez utiliser comme clé entre parenthèses dans la clause where avant 'in' et que l'instruction select avec les mêmes noms de colonnes entre parenthèses. où ( column1, column2 ) dans () sélectionnez ( column1, column2 ) de la table où "l'ensemble que je veux" );

7
ant