Mysql
 sql >> Base de données >  >> RDS >> Mysql

Vous ne pouvez pas spécifier la table cible pour la mise à jour dans la clause FROM

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 bon WHERE clause pour limiter les résultats, aussi.