Le problème est que MySQL, pour une raison quelconque, ne vous permet pas d'écrire des requêtes comme celle-ci :
UPDATE myTable
SET myTable.A =
(
SELECT B
FROM myTable
INNER JOIN ...
)
Autrement dit, si vous faites une UPDATE
/INSERT
/DELETE
sur une table, vous ne pouvez pas référencer cette table dans une requête interne (vous pouvez cependant référencer un champ de cette table externe...)
La solution est de remplacer l'instance de myTable
dans la sous-requête avec (SELECT * FROM myTable)
, comme ça
UPDATE myTable
SET myTable.A =
(
SELECT B
FROM (SELECT * FROM myTable) AS something
INNER JOIN ...
)
Cela provoque apparemment la copie implicite des champs nécessaires dans une table temporaire, donc c'est autorisé.
J'ai trouvé cette solution ici . Une note de cet article :
Vous ne voulez pas simplement
SELECT * FROM table
dans la sous-requête dans la vraie vie ; Je voulais juste garder les exemples simples. En réalité, vous ne devriez sélectionner que les colonnes dont vous avez besoin dans cette requête la plus interne et ajouter un bonWHERE
clause pour limiter les résultats, aussi.