Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MYSQL अपडेट आंतरिक चरणों में शामिल हों

"क्वेरी सही ढंग से पंक्तियों को अपडेट नहीं कर रही" के लिए:

आप कॉलम को अपडेट करना चाहते हैं 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 खंड, मेरे रूप में, "अच्छा" परिणाम खोजने के लिए, मुझे न्यूनतम पहले खोजने के अलावा कई अन्य विकल्प नहीं दिखते हैं उप-क्वेरी के माध्यम से...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. हम लेफ्ट आउटर जॉइन बनाम लेफ्ट जॉइन में कैसे अंतर कर सकते हैं

  2. एकल mysql क्वेरी द्वारा एकाधिक तालिकाओं को कैसे अपडेट करें?

  3. जेपीए हाइबरनेट का उपयोग करके MySQL संग्रहीत कार्यविधि बनाएं

  4. MySQL के बारे में शीर्ष 10 रोचक तथ्य और टिप्स

  5. MySQL क्रॉसस्टैब / पिवट एग्रीगेशन। अन्य तालिका में कॉलम के आधार पर गणना निकालना