Kueri gagal karena Anda tidak dapat mengubah tabel dan memilih dari tabel yang sama dalam subkueri.
Lihat Sintaks Subquery
Saya pikir Anda bisa menyiasatinya dengan beberapa tipu muslihat GABUNG:
UPDATE meterreadings AS tgt
INNER JOIN (
SELECT * FROM meterreadings
WHERE meterreadingtype_id = 2
) AS src
ON tgt.meterreadingdate = src.meterreadingdate
AND tgt.location_id = src.location_id
AND tgt.created = src.created
AND tgt.asset_id = src.asset_id
SET tgt.meterreading = src.meterreading
Saya bukan ahli MySQL, tapi saya yakin ini berhasil karena MySQL memproses subquery terlebih dahulu dan menyimpan hasilnya di memori sebagai tabel sementara, yang tidak berubah selama UPDATE. Efek sampingnya adalah jika hasil subquery besar, maka Anda akan menghabiskan banyak (atau kehabisan) memori.
Satu-satunya cara (sejauh yang saya tahu) untuk mengatasi masalah memori adalah dengan mengurangi subquery menggunakan kriteria yang tidak terkait langsung dengan target pembaruan. Misalnya, jika Anda melakukan pembaruan ini sebagai bagian dari proses malam, buat SELECT dalam hanya mengembalikan baris yang dibuat dalam ~24 jam terakhir.