Problem polega na tym, że MySQL, z jakiegoś głupiego powodu, nie pozwala na pisanie takich zapytań:
UPDATE myTable
SET myTable.A =
(
SELECT B
FROM myTable
INNER JOIN ...
)
To znaczy, jeśli robisz UPDATE
/INSERT
/DELETE
w tabeli, nie możesz odwoływać się do tej tabeli w zapytaniu wewnętrznym (możesz można jednak odwołaj się do pola z tej tabeli zewnętrznej...)
Rozwiązaniem jest zastąpienie instancji myTable
w podzapytaniu z (SELECT * FROM myTable)
, tak jak to
UPDATE myTable
SET myTable.A =
(
SELECT B
FROM (SELECT * FROM myTable) AS something
INNER JOIN ...
)
To najwyraźniej powoduje, że niezbędne pola są niejawnie kopiowane do tabeli tymczasowej, więc jest to dozwolone.
Znalazłem to rozwiązanie tutaj . Notatka z tego artykułu:
Nie chcesz po prostu SELECT * FROM table
w podzapytaniu w prawdziwym życiu; Chciałem tylko, żeby przykłady były proste. W rzeczywistości powinieneś wybierać tylko te kolumny, których potrzebujesz w tym najbardziej wewnętrznym zapytaniu i dodawać dobre WHERE
klauzula ograniczająca również wyniki.