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 utiliza en la parte SELECCIONAR.
Este comportamiento se documenta en: http://dev.mysql.com/doc/refman/5.6/en/update.html
Tal vez usted puede simplemente unirse a la tabla consigo misma
Si la lógica es suficiente para volver a dar forma a la consulta, perderá la subconsulta y unirse a la mesa a la simple sí mismo, empleando los criterios de selección apropiados. Esto hará que MySQL vea la tabla como dos cosas diferentes, permitiendo que los cambios destructivos continúen.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
otra parte, trate de anidación de la subconsulta más profundamente en una cláusula FROM ...
Si necesita absolutamente la subconsulta, hay una solución, pero es fea por varias razones, incluyendo la actuación:
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 cuidado con el optimizador de consultas
Sin embargo, ten en cuenta que a partir MySQL 5.7.6 y en adelante, el optimizador puede optimizar la subconsulta, y todavía le dará el error. Afortunadamente, la variable optimizer_switch
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 únicas.
SET optimizer_switch = 'derived_merge=off';
Gracias a Peter V. Mørch para este consejo en los comentarios.
La técnica de ejemplo fue de Baron Schwartz, originally published at Nabble, parafraseada y extendida aquí.
relacionadas: http://stackoverflow.com/a/14302701/238419 –
parece como la solicitud de función en el rastreador de errores de MySQL está aquí: [no se puede actualizar una tabla y seleccionar de la misma tabla en una subconsulta] (https: //bugs.mys ql.com/bug.php?id=23353) –