Проблемът е, че MySQL, по някаква глупава причина, не ви позволява да пишете заявки като това:
UPDATE myTable
SET myTable.A =
(
SELECT B
FROM myTable
INNER JOIN ...
)
Тоест, ако правите UPDATE
/INSERT
/DELETE
на таблица, не можете да препратите към тази таблица във вътрешна заявка (можете можете обаче препратете към поле от тази външна таблица...)
Решението е да се замени екземплярът на myTable
в подзаявката с (SELECT * FROM myTable)
, като това
UPDATE myTable
SET myTable.A =
(
SELECT B
FROM (SELECT * FROM myTable) AS something
INNER JOIN ...
)
Това очевидно кара необходимите полета да бъдат имплицитно копирани във временна таблица, така че е разрешено.
Намерих това решение тук . Бележка от тази статия:
Не искате просто да
SELECT * FROM table
в подзаявката в реалния живот; Просто исках да запазя примерите прости. В действителност трябва да избирате само колоните, от които се нуждаете в тази най-вътрешна заявка, и да добавяте добърWHERE
клауза за ограничаване на резултатите също.