UPDATE t1
INNER JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t2.t3_id = t3.id
SET t1.a = 'something',
t2.b = 42,
t3.c = t2.c
WHERE t1.a = 'blah';
Pour voir ce que cela va mettre à jour, vous pouvez le convertir en une instruction de sélection, par exemple:
SELECT t2.t1_id, t2.t3_id, t1.a, t2.b, t2.c AS t2_c, t3.c AS t3_c
FROM t1
INNER JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t2.t3_id = t3.id
WHERE t1.a = 'blah';
Un exemple utilisant les mêmes tableaux que l'autre réponse:
SELECT Books.BookID, Orders.OrderID,
Orders.Quantity AS CurrentQuantity,
Orders.Quantity + 2 AS NewQuantity,
Books.InStock AS CurrentStock,
Books.InStock - 2 AS NewStock
FROM Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
WHERE Orders.OrderID = 1002;
UPDATE Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
SET Orders.Quantity = Orders.Quantity + 2,
Books.InStock = Books.InStock - 2
WHERE Orders.OrderID = 1002;
ÉDITER:
Juste pour le plaisir, ajoutons quelque chose d'un peu plus intéressant.
Disons que vous avez une table de books
et une table de authors
. Vous books
avez un author_id
. Mais lorsque la base de données a été créée à l'origine, aucune contrainte de clé étrangère n'a été définie et plus tard, un bogue dans le code frontal a provoqué l'ajout de certains livres avec des author_id
s invalides . En tant que DBA, vous ne voulez pas avoir à parcourir tous ces éléments books
pour vérifier ce que author_id
devrait être, donc la décision est prise que les capteurs de données corrigent le books
point à droite authors
. Mais il y a trop de livres pour parcourir chacun d'eux et disons que vous savez que ceux qui ont un author_id
qui correspond à un réel author
sont corrects. Ce sont juste ceux qui n'ont pasauthor_id
s qui ne sont pas valides. Il existe déjà une interface permettant aux utilisateurs de mettre à jour les détails du livre et les développeurs ne veulent pas changer cela uniquement pour ce problème. Mais l'interface existante fait un INNER JOIN authors
, donc tous les livres dont les auteurs sont invalides sont exclus.
Voici ce que vous pouvez faire: Insérez un faux enregistrement d'auteur comme "Auteur inconnu". Mettez ensuite à jour le author_id
de tous les mauvais enregistrements pour pointer vers l'auteur inconnu. Ensuite, les captureurs de données peuvent rechercher tous les livres dont l'auteur est défini sur "Auteur inconnu", rechercher l'auteur correct et les corriger.
Comment mettre à jour tous les mauvais enregistrements pour qu'ils pointent vers l'auteur inconnu? Comme ceci (en supposant que l'auteur inconnu author_id
est 99999):
UPDATE books
LEFT OUTER JOIN authors ON books.author_id = authors.id
SET books.author_id = 99999
WHERE authors.id IS NULL;
Ce qui précède mettra également à jour books
qui ont un NULL
author_id
auteur inconnu. Si vous ne le souhaitez pas, vous pouvez bien sûr ajouter AND books.author_id IS NOT NULL
.