Aggiornamento: questa risposta copre la classificazione generale dell'errore. Per una risposta più specifica su come gestire al meglio la query esatta del PO, consultare le altre risposte a questa domanda
In MySQL, non è possibile modificare la stessa tabella utilizzata nella parte SELECT.
Questo comportamento è documentato su:
http://dev.mysql.com/doc/refman/5.6/en/update.html
Forse puoi semplicemente unirti al tavolo
Se la logica è abbastanza semplice per riformare la query, perdere la sottoquery e unire la tabella a se stessa, utilizzando criteri di selezione appropriati. Ciò farà sì che MySQL consideri la tabella come due cose diverse, consentendo di apportare modifiche distruttive.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
In alternativa, prova a nidificare la subquery più in profondità in una clausola from ...
Se hai assolutamente bisogno della subquery, c'è una soluzione alternativa, ma è brutta per diversi motivi, tra cui le prestazioni:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
La subquery nidificata nella clausola FROM crea una tabella temporanea implicita , quindi non conta come la stessa tabella che stai aggiornando.
... ma fai attenzione al Query Optimizer
Tuttavia, attenzione che da MySQL 5.7.6 e versioni successive, l'ottimizzatore può ottimizzare la subquery e comunque restituire l'errore. Fortunatamente, la optimizer_switch
variabile può essere utilizzata per disattivare questo comportamento; anche se non potrei raccomandare di farlo come qualcosa di più di una soluzione a breve termine o per piccole attività una tantum.
SET optimizer_switch = 'derived_merge=off';
Grazie a Peter V. Mørch per questo consiglio nei commenti.
La tecnica di esempio è stata del barone Schwartz, originariamente pubblicata su Nabble , qui parafrasata ed estesa.