Pembaruan: Jawaban ini mencakup klasifikasi kesalahan umum. Untuk jawaban yang lebih spesifik tentang cara terbaik menangani permintaan persis OP, silakan lihat jawaban lain untuk pertanyaan ini
Di MySQL, Anda tidak bisa mengubah tabel yang sama yang Anda gunakan di bagian SELECT.
Perilaku ini didokumentasikan di:
http://dev.mysql.com/doc/refman/5.6/en/update.html
Mungkin Anda bisa bergabung dengan tabel itu sendiri
Jika logikanya cukup sederhana untuk membentuk kembali kueri, kehilangan subquery dan bergabung dengan tabel itu sendiri, menggunakan kriteria seleksi yang sesuai. Ini akan menyebabkan MySQL melihat tabel sebagai dua hal yang berbeda, memungkinkan perubahan destruktif untuk terus maju.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
Atau, coba nempatkan subquery lebih dalam ke dalam dari klausa ...
Jika Anda benar-benar membutuhkan subquery, ada solusinya, tetapi jelek karena beberapa alasan, termasuk kinerja:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
Subquery bersarang di klausa FROM membuat tabel sementara implisit , sehingga tidak dihitung sebagai tabel yang sama dengan yang Anda perbarui.
... tapi hati-hati dengan pengoptimal kueri
Namun, berhati-hatilah bahwa dari MySQL 5.7.6 dan seterusnya, pengoptimal dapat mengoptimalkan subquery, dan masih memberi Anda kesalahan. Untungnya, optimizer_switch
variabel dapat digunakan untuk mematikan perilaku ini; meskipun saya tidak bisa merekomendasikan melakukan ini sebagai sesuatu yang lebih dari perbaikan jangka pendek, atau untuk tugas-tugas kecil satu kali.
SET optimizer_switch = 'derived_merge=off';
Terima kasih kepada Peter V. Mørch untuk saran ini di komentar.
Contoh teknik berasal dari Baron Schwartz, awalnya diterbitkan di Nabble , diparafrasekan dan diperluas di sini.