अद्यतन:यह उत्तर सामान्य त्रुटि वर्गीकरण को शामिल करता है। ओपी की सटीक क्वेरी को सर्वोत्तम तरीके से संभालने के तरीके के बारे में अधिक विशिष्ट उत्तर के लिए, कृपया इस प्रश्न के अन्य उत्तर देखें
MySQL में, आप उसी तालिका को संशोधित नहीं कर सकते जिसका उपयोग आप SELECT भाग में करते हैं।
यह व्यवहार यहां प्रलेखित है:http://dev.mysql.com/doc/refman/5.6/en/update.html
हो सकता है कि आप केवल तालिका में ही शामिल हों
यदि तर्क क्वेरी को फिर से आकार देने के लिए पर्याप्त सरल है, तो सबक्वायरी खो दें और उपयुक्त चयन मानदंड को नियोजित करते हुए तालिका में शामिल हो जाएं। यह MySQL को तालिका को दो अलग-अलग चीजों के रूप में देखने का कारण बनेगा, जिससे विनाशकारी परिवर्तन आगे बढ़ सकेंगे।
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
वैकल्पिक रूप से, उप-क्वेरी को से खंड में गहराई से नेस्ट करने का प्रयास करें ...
यदि आपको पूरी तरह से सबक्वायरी की आवश्यकता है, तो एक समाधान है, लेकिन यह प्रदर्शन सहित कई कारणों से बदसूरत है:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
FROM क्लॉज में नेस्टेड सबक्वेरी एक अंतर्निहित अस्थायी बनाता है , इसलिए यह उसी तालिका के रूप में नहीं गिना जाता है जिसे आप अपडेट कर रहे हैं।
... लेकिन क्वेरी ऑप्टिमाइज़र से सावधान रहें
हालांकि, सावधान रहें कि MySQL 5.7 से .6
और आगे, ऑप्टिमाइज़र सबक्वेरी को ऑप्टिमाइज़ कर सकता है, और फिर भी आपको त्रुटि दे सकता है। सौभाग्य से, optimizer_switch
इस व्यवहार को बंद करने के लिए चर का उपयोग किया जा सकता है; हालांकि मैं इसे एक अल्पकालिक सुधार, या छोटे एकबारगी कार्यों के अलावा और कुछ करने की अनुशंसा नहीं कर सकता था।
SET optimizer_switch = 'derived_merge=off';
धन्यवाद पीटर वी. मॉर्च टिप्पणियों में इस सलाह के लिए।
उदाहरण तकनीक बैरन श्वार्ट्ज से थी, मूल रूप से नाबल में प्रकाशित , व्याख्या की गई और यहां विस्तारित की गई।