Masalahnya adalah MySQL, untuk alasan apa pun yang tidak masuk akal, tidak mengizinkan Anda menulis kueri seperti ini:
UPDATE myTable
SET myTable.A =
(
SELECT B
FROM myTable
INNER JOIN ...
)
Yaitu, jika Anda melakukan UPDATE
/INSERT
/DELETE
pada tabel, Anda tidak dapat mereferensikan tabel itu dalam kueri dalam (Anda bisa namun referensi bidang dari tabel luar itu...)
Solusinya adalah mengganti instance myTable
di sub-kueri dengan (SELECT * FROM myTable)
, seperti ini
UPDATE myTable
SET myTable.A =
(
SELECT B
FROM (SELECT * FROM myTable) AS something
INNER JOIN ...
)
Hal ini tampaknya menyebabkan bidang yang diperlukan disalin secara implisit ke dalam tabel sementara, sehingga diperbolehkan.
Saya menemukan solusi ini di sini . Catatan dari artikel itu:
Anda tidak ingin hanya
SELECT * FROM table
dalam subquery dalam kehidupan nyata; Saya hanya ingin membuat contoh sederhana. Pada kenyataannya, Anda seharusnya hanya memilih kolom yang Anda butuhkan dalam kueri terdalam itu, dan menambahkanWHERE
yang bagus klausa untuk membatasi hasil juga.