क्वेरी विफल हो रही है क्योंकि आप किसी तालिका को संशोधित नहीं कर सकते हैं और उसी तालिका से सबक्वेरी में चयन नहीं कर सकते हैं।
देखें सबक्वायरी सिंटैक्स
मुझे लगता है कि आप कुछ जॉइन ट्रिकी के साथ इससे निजात पा सकते हैं:
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 पहले सबक्वायरी को संसाधित करता है और परिणाम को अस्थायी तालिका के रूप में स्मृति में संग्रहीत करता है, जो अद्यतन के दौरान नहीं बदलता है। इसका एक दुष्परिणाम यह है कि यदि सबक्वेरी का परिणाम बड़ा है, तो आप एक टन (या समाप्त) मेमोरी को चबा लेंगे।
स्मृति समस्या को हल करने का एकमात्र तरीका (जहां तक मुझे पता है) मानदंड का उपयोग करके सबक्वायरी को कम करना है जो सीधे अद्यतन लक्ष्य से संबंधित नहीं हैं। उदाहरण के लिए, यदि आप इन अद्यतनों को रात्रिकालीन प्रक्रिया के भाग के रूप में करना चाहते हैं, तो आंतरिक SELECT केवल पिछले ~24 घंटों में बनाई गई पंक्तियों को लौटाएं।