Maison > Questions et réponses > le corps du texte
P粉2371257002023-08-28 13:59:47
Vous pouvez le faire en trois étapes :
CREATE TABLE test2 AS SELECT PersId FROM pers p WHERE ( chefID IS NOT NULL OR gehalt < ( SELECT MAX ( gehalt * 1.05 ) FROM pers MA WHERE MA.chefID = p.chefID ) )
...
UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE PersId IN ( SELECT PersId FROM test2 ) DROP TABLE test2;
ou
UPDATE Pers P, ( SELECT PersId FROM pers p WHERE ( chefID IS NOT NULL OR gehalt < ( SELECT MAX ( gehalt * 1.05 ) FROM pers MA WHERE MA.chefID = p.chefID ) ) ) t SET P.gehalt = P.gehalt * 1.05 WHERE p.PersId = t.PersId
P粉4818158972023-08-28 13:51:38
Le problème est que, pour une raison stupide, MySQL ne vous permet pas d'écrire une requête comme celle-ci :
UPDATE myTable SET myTable.A = ( SELECT B FROM myTable INNER JOIN ... )
Autrement dit, si vous souhaitez effectuer UPDATE
/INSERT
/DELETE
opérations sur la table, vous ne pouvez pas interroger en interne (mais vous pouvez référencer des champs depuis la table externe...)
La solution est de mettre myTable
实例替换为(SELECT * FROM myTable)
dans la sous-requête comme indiqué ci-dessous
UPDATE myTable SET myTable.A = ( SELECT B FROM (SELECT * FROM myTable) AS something INNER JOIN ... )
Cela entraînera évidemment la copie implicite des champs nécessaires dans la table temporaire, cela est donc autorisé.
J'ai trouvé cette solution ici. Commentaires sur cet article :