web-dev-qa-db-fra.com

MySql Update A Joined Table

Je souhaite mettre à jour une table dans une instruction qui a plusieurs jointures. Bien que je sache que l'ordre des jointures n'a pas vraiment d'importance (à moins que vous n'utilisiez des conseils d'optimisation), je les ai commandés d'une certaine manière pour être plus intuitifs à lire. Cependant, cela signifie que le tableau que je veux mettre à jour n'est pas celui par lequel je commence et j'ai du mal à le mettre à jour.

Un exemple factice de ce que j'aimerais faire est quelque chose comme:

UPDATE b
FROM tableA a
JOIN tableB b
   ON a.a_id = b.a_id
JOIN tableC c
   ON b.b_id = c.b_id
SET b.val = a.val+c.val
WHERE a.val > 10
    AND c.val > 10;

Il existe de nombreux articles sur la mise à jour avec les jointures ici, mais ils ont toujours la table mise à jour en premier. Je sais que c'est possible dans SQL Server et j'espère que c'est possible dans MySQL aussi!

36
Zugwalt

La syntaxe UPDATE multi-tables dans MySQL est différente de Microsoft SQL Server. Vous n'avez pas besoin de dire quelle table vous mettez à jour, c'est implicite dans votre clause SET.

UPDATE tableA a
JOIN tableB b
   ON a.a_id = b.a_id
JOIN tableC c
   ON b.b_id = c.b_id
SET b.val = a.val+c.val
WHERE a.val > 10
    AND c.val > 10;

Il n'y a pas de clause FROM dans la syntaxe de MySQL.

UPDATE avec JOIN n'est pas du SQL standard, et MySQL et Microsoft SQL Server ont implémenté leurs propres idées comme une extension de la syntaxe standard.

91
Bill Karwin

Vous avez mal ordonné les déclarations. Vous pouvez lire la syntaxe ici (Je sais, c'est assez difficile à lire.

UPDATE tableA a
  JOIN tableB b
    ON a.a_id = b.a_id
  JOIN tableC c
    ON b.b_id = c.b_id
   SET b.val = a.val+c.val
 WHERE a.val > 10
   AND c.val > 10;

violon sql

3
Andreas Wederbrand

Ce lien devrait vous donner la syntaxe dont MySQL a besoin et ici est un exemple. Pourquoi avez-vous besoin de rejoindre les deux tables? est-ce pour limiter les enregistrements mis à jour? Je demande parce que vous pouvez également faire quelque chose comme ceci:

update B set B.x=<value>
    where 
B.<value> is in(
    select A.y 
      from A left outer join B on A.<value>=B.<value>
)
0
John Kane

Une autre construction correcte, que nous pouvons utiliser dans cette situation:

UPDATE T1, T2,
[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1
SET T1.C2 = T2.C2, 
    T2.C3 = expr
WHERE condition

L'exemple ci-dessus est tiré de: MySQL UPDATE JOIN .

Atteindre le MySQL 8.0 Reference Manual nous trouverons une telle description de syntaxe UPDATE à plusieurs tables :

UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET assignment_list
[WHERE where_condition]

La clause table_references répertorie les tables impliquées dans join.

Donc la syntaxe de MySQL à tables multiples ne prend pas en charge FROM, ORDER BY ou LIMIT clauses par opposition à syntaxe de table unique .

0
simhumileco