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!
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.
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;
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>
)
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 .