Actualización: esta respuesta cubre la clasificación de error general. Para obtener una respuesta más específica sobre cómo manejar mejor la consulta exacta del OP, consulte otras respuestas a esta pregunta
En MySQL, no puede modificar la misma tabla que usa en la parte SELECT.
Este comportamiento está documentado en:
http://dev.mysql.com/doc/refman/5.6/en/update.html
Quizás puedas unirte a la mesa
Si la lógica es lo suficientemente simple como para cambiar la forma de la consulta, pierda la subconsulta y una la tabla a sí misma, empleando los criterios de selección adecuados. Esto hará que MySQL vea la tabla como dos cosas diferentes, permitiendo que se produzcan cambios destructivos.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
Alternativamente, intente anidar la subconsulta más profundamente en una cláusula from ...
Si realmente necesita la subconsulta, hay una solución alternativa, pero es fea por varias razones, incluido el rendimiento:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
La subconsulta anidada en la cláusula FROM crea una tabla temporal implícita , por lo que no cuenta como la misma tabla que está actualizando.
... pero ten cuidado con el optimizador de consultas
Sin embargo, tenga en cuenta que desde MySQL 5.7.6 y posteriores, el optimizador puede optimizar la subconsulta y aún así le dará el error. Afortunadamente, la optimizer_switch
variable se puede usar para desactivar este comportamiento; aunque no podría recomendar hacer esto como algo más que una solución a corto plazo, o para pequeñas tareas puntuales.
SET optimizer_switch = 'derived_merge=off';
Gracias a Peter V. Mørch por este consejo en los comentarios.
La técnica de ejemplo fue del barón Schwartz, originalmente publicado en Nabble , parafraseado y extendido aquí.