テーブルを変更してサブクエリで同じテーブルから選択できないため、クエリは失敗します。
サブクエリ構文 を参照してください。
JOINのトリックでこれを回避できると思います:
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
私はMySQLの専門家ではありませんが、MySQLが最初にサブクエリを処理し、その結果を一時テーブルとしてメモリに保存するため、これは機能すると思います。このテーブルはUPDATE中に変更されません。これの副作用は、サブクエリの結果が大きい場合、大量のメモリをかみ砕く(または使い果たす)ことです。
(私が知る限り)メモリの問題を回避する唯一の方法は、更新ターゲットに直接関係しない基準を使用してサブクエリを削減することです。たとえば、夜間のプロセスの一部としてこれらの更新を行う場合は、内部SELECTが過去24時間以内に作成された行のみを返すようにします。