Dotaz se nezdařil, protože nemůžete upravit tabulku a vybrat ze stejné tabulky v poddotazu.
Myslím, že to můžete obejít nějakým trikem 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
Nejsem odborník na MySQL, ale věřím, že to funguje, protože MySQL nejprve zpracuje poddotaz a uloží výsledek do paměti jako dočasnou tabulku, která se během UPDATE nemění. Vedlejším efektem je, že pokud je výsledek dílčího dotazu velký, sežerete spoustu paměti (nebo jí dojde nedostatek).
Jediný způsob (pokud vím), jak obejít problém s pamětí, je zredukovat poddotaz pomocí kritérií, která přímo nesouvisí s cílem aktualizace. Pokud byste například tyto aktualizace prováděli jako součást nočního procesu, zajistěte, aby vnitřní SELECT vracel pouze řádky vytvořené za posledních ~24 hodin.