Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Sie können die Zieltabelle für die Aktualisierung nicht in der FROM-Klausel angeben

Das Problem ist, dass MySQL Ihnen aus irgendwelchen dummen Gründen nicht erlaubt, Abfragen wie diese zu schreiben:

UPDATE myTable
SET myTable.A =
(
    SELECT B
    FROM myTable
    INNER JOIN ...
)

Das heißt, wenn Sie ein UPDATE durchführen /INSERT /DELETE auf eine Tabelle können Sie diese Tabelle nicht in einer inneren Abfrage referenzieren (Sie können verweisen Sie jedoch auf ein Feld aus dieser äußeren Tabelle ...)

Die Lösung besteht darin, die Instanz von myTable zu ersetzen in der Unterabfrage mit (SELECT * FROM myTable) , so

UPDATE myTable
SET myTable.A =
(
    SELECT B
    FROM (SELECT * FROM myTable) AS something
    INNER JOIN ...
)

Dies bewirkt anscheinend, dass die erforderlichen Felder implizit in eine temporäre Tabelle kopiert werden, also ist es erlaubt.

Ich habe diese Lösung gefunden hier . Eine Anmerkung zu diesem Artikel:

Sie möchten nicht nur SELECT * FROM table in der Unterabfrage im wirklichen Leben; Ich wollte nur die Beispiele einfach halten. In Wirklichkeit sollten Sie nur die Spalten auswählen, die Sie in dieser innersten Abfrage benötigen, und ein gutes WHERE hinzufügen Klausel, um die Ergebnisse ebenfalls einzuschränken.