Mysql
 sql >> Database >  >> RDS >> Mysql

Non è possibile specificare la tabella di destinazione per l'aggiornamento nella clausola FROM

Il problema è che MySQL, per qualsiasi motivo insensato, non ti consente di scrivere query come questa:

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

Cioè, se stai eseguendo un UPDATE /INSERT /DELETE su una tabella, non puoi fare riferimento a quella tabella in una query interna (tu puoi tuttavia fai riferimento a un campo da quella tabella esterna...)

La soluzione è sostituire l'istanza di myTable nella sottoquery con (SELECT * FROM myTable) , così

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

Questo apparentemente fa sì che i campi necessari vengano copiati implicitamente in una tabella temporanea, quindi è consentito.

Ho trovato questa soluzione qui . Una nota da quell'articolo:

Non vuoi solo SELECT * FROM table nella subquery nella vita reale; Volevo solo mantenere gli esempi semplici. In realtà, dovresti solo selezionare le colonne di cui hai bisogno in quella query più interna e aggiungere un buon WHERE clausola per limitare anche i risultati.