Atualização: Esta resposta cobre a classificação geral de erros. Para obter uma resposta mais específica sobre como lidar melhor com a consulta exata do OP, consulte outras respostas a esta pergunta
No MySQL, você não pode modificar a mesma tabela que você usa na parte SELECT.
Esse comportamento está documentado em:
http://dev.mysql.com/doc/refman/5.6/en/update.html
Talvez você possa simplesmente juntar a mesa a si próprio
Se a lógica for simples o suficiente para remodelar a consulta, perca a subconsulta e junte a tabela a ela mesma, empregando critérios de seleção apropriados. Isso fará com que o MySQL veja a tabela como duas coisas diferentes, permitindo que mudanças destrutivas ocorram.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
Como alternativa, tente aninhar a subconsulta mais profundamente na cláusula from ...
Se você absolutamente precisa da subconsulta, há uma solução alternativa, mas é feia por vários motivos, incluindo desempenho:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
A subconsulta aninhada na cláusula FROM cria uma tabela temporária implícita , portanto não conta como a mesma tabela que você está atualizando.
... mas cuidado com o otimizador de consultas
No entanto, tenha cuidado com o MySQL 5.7.6 em diante, o otimizador pode otimizar a subconsulta e ainda assim fornecer o erro. Felizmente, a optimizer_switch
variável pode ser usada para desativar esse comportamento; embora eu não possa recomendar fazer isso como algo além de uma correção de curto prazo ou para pequenas tarefas pontuais.
SET optimizer_switch = 'derived_merge=off';
Obrigado a Peter V. Mørch por esse conselho nos comentários.
A técnica de exemplo foi do Barão Schwartz, originalmente publicada em Nabble , parafraseada e estendida aqui.