Comment faire 3 table JOIN dans une requête UPDATE?

466

J'ai posé une question et obtenu cette réponse qui m'a aidé.

   UPDATE TABLE_A a JOIN TABLE_B b 
   ON a.join_col = b.join_col AND a.column_a = b.column_b 
   SET a.column_c = a.column_c + 1

Maintenant, je cherche à faire cela s'il y a 3 tables impliquées quelque chose comme ça.

    UPDATE tableC c JOIN tableB b JOIN tableA a

ma question est essentiellement ... est-il possible de faire 3 table join sur une UPDATEdéclaration? et quelle est la syntaxe correcte pour cela? Je vous remercie. Dois-je faire le ...

 JOIN tableB, tableA
 JOIN tableB JOIN tableA
Ricky
la source
2
Bien sûr, c'est possible. Essaie. La syntaxe est exactement comme vous l'avez - vous avez juste besoin d'ajouter le suivant JOINet sa ONcondition, comme vous le feriez dans une SELECTrequête.
Michael Berkowski
2
UPDATE t1 JOIN t2 ON t1.id = t2.t1_id JOIN t3 ON t3.id = t2.t3_id SET t1.col = 'newval'
Michael Berkowski
1
La question mentionnée est ici: stackoverflow.com/questions/15206746/…
Urs

Réponses:

810

la réponse est que yesvous pouvez

essayez comme ça

UPDATE TABLE_A a 
    JOIN TABLE_B b ON a.join_col = b.join_col AND a.column_a = b.column_b 
    JOIN TABLE_C c ON [condition]
SET a.column_c = a.column_c + 1

ÉDITER:

Pour une mise à jour générale, rejoignez:

   UPDATE TABLEA a 
   JOIN TABLEB b ON a.join_colA = b.join_colB  
   SET a.columnToUpdate = [something]
echo_Me
la source
2
Une chose étrange est cependant que mon logiciel HeidiSQL ne signale aucune ligne affectée, bien que les données montrent que les mises à jour ont été effectuées.
Pianoman
1
@Pianoman Pour moi, cela s'est également produit et cela a quelque chose à voir avec ON UPDATE CURRENT_TIMESTAMP, je viens d'ajouter manuellement la mise à jour et de la
corriger
Si vous avez besoin d'une aide visuelle pour obtenir vos jointures correctement: Browse-tutorials.com/tutorial/mysql-joins-visual-representation
ram4nd
Je pense que ce qui suit est un meilleur plan général: UPDATE table A JOIN table B ON {join data} JOIN table C ON {join data} JOIN {more join tables} SET A.column = {expression}(pardonnez-moi si ce foutu éditeur ne me laisse pas entrer dans les nouvelles lignes sans faire un post complet)
UncaAlby
Où est WHERE?? Ou WHEREn'est-ce pas possible?
Vert
42

Une autre façon d' obtenir le même résultat est de ne pas utiliser du tout de JOINmots clés.

UPDATE TABLE_A, TABLE_B
SET TABLE_A.column_c = TABLE_B.column_c + 1
WHERE TABLE_A.join_col = TABLE_B.join_col
Matas Vaitkevicius
la source
3
J'ai essayé cela sur 5.5.62 et mysql n'aimait pas la syntaxe. Selon le manuel [ dev.mysql.com/doc/refman/5.6/en/update.html] , la requête devrait être:UPDATE TABLE_A, TABLE_B SET TABLE_A.column_c = TABLE_A.column_c +1 WHERE TABLE_A.join_col = TABLE_B.join_col
Noe Nieto
7
Cela fait un implicite JOINde la même façon de faire SELECT * FROM TABLE_A, TABLE_B ...ne
Madbreaks
Cela signifie-t-il que dans 5.5, seul le formulaire de jointure implicite est accepté pour la mise à jour?
userfuser
@userfuser Non, ce n'est pas le cas, le manuel indique la syntaxe: UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]Plus tard, le manuel indique: "La table_referencesclause répertorie les tables impliquées dans la jointure. Sa syntaxe est décrite dans la section 13.2.9.2, Syntaxe JOIN ."
hmundt
4
Pas exactement le même résultat - vous pouvez faire des jointures gauches avec la syntaxe de jointure.
Gerard ONeill
10

Ci - dessous la requête de mise à jour qui comprend JOINet WHEREdeux. De la même manière que nous pouvons utiliser la clause join / where multiple, j'espère que cela vous aidera: -

UPDATE opportunities_cstm oc JOIN opportunities o ON oc.id_c = o.id
 SET oc.forecast_stage_c = 'APX'
 WHERE o.deleted = 0
   AND o.sales_stage IN('ABC','PQR','XYZ')
Nitin Shukla
la source
3
Bienvenue dans Stack Overflow! Merci pour cet extrait de code, qui peut fournir une aide immédiate. Une explication appropriée améliorerait considérablement sa valeur éducative en montrant pourquoi il s'agit d'une bonne solution au problème, et la rendrait plus utile aux futurs lecteurs ayant des questions similaires, mais pas identiques. Veuillez modifier votre réponse pour ajouter des explications et donner une indication des limitations et hypothèses applicables.
Toby Speight
2

Un plan général alternatif, que j'ajoute uniquement en tant que réponse indépendante parce que le "commentaire sur une réponse" foudroyé ne prendra pas de nouvelles lignes sans publier l'intégralité du montage, même s'il n'est pas encore terminé.

UPDATE table A
JOIN table B ON {join fields}
JOIN table C ON {join fields}
JOIN {as many tables as you need}
SET A.column = {expression}

Exemple:

UPDATE person P
JOIN address A ON P.home_address_id = A.id
JOIN city C ON A.city_id = C.id
SET P.home_zip = C.zipcode;
UncaAlby
la source
1

Pour l'exemple PostgreSQL:

UPDATE TableA AS a
SET param_from_table_a=FALSE -- param FROM TableA
FROM TableB AS b
WHERE b.id=a.param_id AND a.amount <> 0; 
Mс1er
la source