Aktualisierung: Diese Antwort behandelt die allgemeine Fehlerklassifizierung. Eine spezifischere Antwort darauf, wie die genaue Anfrage des Auftraggebers am besten zu behandeln ist, finden Sie in anderen Antworten auf diese Frage
In MySQL können Sie nicht die gleiche Tabelle ändern, die Sie im SELECT-Teil verwenden.
Dieses Verhalten ist dokumentiert unter: http://dev.mysql.com/doc/refman/5.6/en/update.html
Vielleicht können Sie die Tabelle einfach mit sich selbst verbinden
Wenn die Logik einfach genug ist, um die Abfrage umzugestalten, lassen Sie die Unterabfrage weg und verbinden Sie die Tabelle mit sich selbst, indem Sie geeignete Auswahlkriterien verwenden. Dadurch wird MySQL veranlasst, die Tabelle als zwei verschiedene Dinge zu betrachten, so dass destruktive Änderungen vorgenommen werden können.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
Versuchen Sie alternativ, die Unterabfrage tiefer in eine from-Klausel zu schachteln ...
Wenn Sie die Unterabfrage unbedingt benötigen, gibt es eine Umgehungslösung, aber die ist hässlich aus mehreren Gründen, einschließlich Leistung:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
Die verschachtelte Unterabfrage in der FROM-Klausel erzeugt eine implizit temporär Tabelle so dass sie nicht als dieselbe Tabelle gilt, die Sie aktualisieren.
... aber achten Sie auf den Abfrageoptimierer
Beachten Sie jedoch, dass von MySQL 5.7.6 und weiter, kann der Optimierer die Unterabfrage optimieren und Ihnen trotzdem den Fehler anzeigen. Glücklicherweise ist die optimizer_switch
kann verwendet werden, um dieses Verhalten abzuschalten, obwohl ich dies nur als kurzfristige Lösung oder für kleine, einmalige Aufgaben empfehlen kann.
SET optimizer_switch = 'derived_merge=off';
Dank an Peter V. Mørch für diesen Ratschlag in den Kommentaren.
Die Beispieltechnik stammt von Baron Schwartz, ursprünglich veröffentlicht bei Nabble , hier paraphrasiert und erweitert.
5 Stimmen
Verwandt: stackoverflow.com/a/14302701/238419
3 Stimmen
Es sieht so aus, als ob der Feature Request im MySQL Bug Tracker hier ist: keine Aktualisierung einer Tabelle und Auswahl aus derselben Tabelle in einer Unterabfrage möglich
1 Stimmen
MariaDB 10.3 ermöglicht die Selbstreferenzierung in UPDATE/DELETE