web-dev-qa-db-fra.com

Mettre à jour plusieurs lignes à l'aide de l'instruction select

J'ai ces tables et valeurs:

Table1
------------------------
ID | Value
------------------------
2 | asdf
4 | fdsa
5 | aaaa


Table2
------------------------
ID | Value
------------------------
2 | bbbb
4 | bbbb
5 | bbbb

Je veux mettre à jour toutes les valeurs de Table2 en utilisant les valeurs de Table1 avec leurs ID respectifs.

Est-il possible de faire cela avec une simple requête SQL?

16
Steven

Exécutez une sélection pour vous assurer que c'est ce que vous voulez

SELECT t1.value AS NEWVALUEFROMTABLE1,t2.value AS OLDVALUETABLE2,*
FROM Table2 t2
INNER JOIN Table1 t1 on t1.ID = t2.ID

Mettre à jour

UPDATE Table2
SET Value = t1.Value
FROM Table2 t2
INNER JOIN Table1 t1 on t1.ID = t2.ID

Pensez également à utiliser BEGIN TRAN pour pouvoir l'annuler si nécessaire, mais assurez-vous de le nommer COMMIT lorsque vous êtes satisfait.

35
user1166147

Si vous avez des identifiants dans les deux tables, ceci fonctionne:

update table2
    set value = (select value from table1 where table1.id = table2.id)

Une meilleure approche est peut-être une jointure:

update table2
    set value = table1.value
    from table1
    where table1.id = table2.id

Notez que cette syntaxe fonctionne dans SQL Server mais peut être différente dans d'autres bases de données.

8
Gordon Linoff

Vous pouvez utiliser alias pour améliorer la requête:

UPDATE t1
   SET t1.Value = t2.Value
  FROM table1 AS t1
         INNER JOIN 
       table2 AS t2
         ON t1.ID = t2.ID
2
rageit

Aucune des réponses ci-dessus n'a fonctionné pour moi dans MySQL , la requête suivante a néanmoins fonctionné:

UPDATE
    Table1 t1
    JOIN
    Table2 t2 ON t1.ID=t2.ID 
SET
    t1.value =t2.value
WHERE
    ...
2
Enayat Rajabi

J'ai utilisé celui-ci sur MySQL, MS Access et SQL Server. Les champs id sont les champs sur lesquels les tables coïncident, pas nécessairement l'index primaire.

UPDATE DestTable INNER JOIN SourceTable ON DestTable.idField = SourceTable.idField SET DestTable.Field1 = SourceTable.Field1, DestTable.Field2 = SourceTable.Field2...
0
Francisco R.