"क्वेरी सही ढंग से पंक्तियों को अपडेट नहीं कर रही" के लिए:
आप कॉलम को अपडेट करना चाहते हैं b
न्यूनतम . तक का b
समान a
. वाली सभी पंक्तियों के लिए
आपने निम्नलिखित JOIN
का उपयोग करने का प्रस्ताव रखा है ऐसा करने के लिए:
UPDATE test.tem t1
JOIN test.tem t2
ON t1.a = t2.a
SET t1.b = t2.b
WHERE t1.b > t2.b
OR t1.b IS NULL;
आप जो सोच सकते हैं उसके विपरीत, JOIN
1-1 JOIN
नहीं करेगा . यह वास्तव में कई-से-अनेक JOIN
. है चूंकि जैसा कि मैंने कल कहा था
आप अपने ज्वाइन क्लॉज में प्राथमिक कुंजी (न ही गैर-शून्य अद्वितीय कुंजी) का उपयोग नहीं करते हैं।
वास्तव में, उस क्वेरी को SELECT
. के रूप में फिर से लिखना शायद आपको समस्या को समझने में मदद मिलेगी:
SELECT t1.a as t1a, t1.b as t1b, t2.a as t2a,t2.b as t2b FROM tem t1 JOIN tem t2
ON t1.a = t2.a
WHERE t1.b > t2.b
OR t1.b IS NULL;
+------+---------+------+--------+
| T1A | T1B | T2A | T2B |
+------+---------+------+--------+
| 1 | (null) | 1 | 2 |
| 1 | 2 | 1 | 1 |
| 1 | (null) | 1 | 1 |
| 1 | (null) | 1 | (null) |
+------+---------+------+--------+
http://sqlfiddle.com/#!2/856a7/8
जैसा कि आप अब देखेंगे, पंक्ति (1, null)
मैच (1, 1)
, (1, 2)
और (1, null)
. क्वेरी के निष्पादन के (गैर-नियतात्मक) क्रम के आधार पर, यह b
के लिए तीन संभावित मानों में से कोई भी मान निर्दिष्ट कर सकता है ('इसके बारे में निश्चित नहीं है, लेकिन शायद यहां तक कि इसे अपडेट करना कई बार)। कुछ हद तक, आप भाग्यशाली रहे हैं कि परीक्षण के दौरान आपको "गलत" परिणाम मिला!
मुझे आशा है कि यह थोड़ा और स्पष्ट करेगा कि आपकी क्वेरी अपेक्षित परिणाम क्यों नहीं देती है। चूंकि मल्टी-टेबल UPDATE
कथन ORDER BY
की अनुमति नहीं देते हैं न ही GROUP BY
खंड, मेरे रूप में, "अच्छा" परिणाम खोजने के लिए, मुझे न्यूनतम पहले खोजने के अलावा कई अन्य विकल्प नहीं दिखते हैं उप-क्वेरी के माध्यम से...