2009-12-01 9 views
5

मैं एक अद्यतन में एक सबक्वेरी उपयोग कर रहा हूँ:सबक्वायरी के माध्यम से अपडेट करें, क्या होगा यदि सबक्वायरी कोई पंक्ति नहीं देता है?

UPDATE tableA 
SET x,y,z = ((SELECT x, y, z 
       FROM tableB b 
       WHERE tableA.id = b.id 
       AND (tableA.x != b.x 
         OR tableA.y != b.y 
         OR tableA.z != b.z)))); 

मेरा प्रश्न है, तो क्या होता है सबक्वेरी रिटर्न कोई भी पंक्ति? क्या यह नल के साथ एक अद्यतन करेगा?

दूसरा, क्या यह लिखने का एक बेहतर तरीका है। मैं मूल रूप से tableB से tableA में तीन फ़ील्ड अपडेट कर रहा हूं, लेकिन अपडेट केवल तभी होना चाहिए जब तीन में से कोई भी फ़ील्ड अलग हो।

+0

इस अद्यतन tableB करने के लिए एक में शामिल होने के पैरामीटर के आधार पर किया जाना चाहिए या यह एक "कार्तीय अद्यतन" क्या है? – adamcodes

+0

'अपडेट केवल तभी होना चाहिए जब तीन में से कोई भी फ़ील्ड अलग हो।' मुझे लगता है कि मुझे कहां से खंड है ... –

उत्तर

5

क्या होता है यदि सबक्वायरी कोई पंक्ति नहीं देता है? क्या यह नल के साथ एक अद्यतन करेगा?

Yes-- आप इस तरह का परीक्षण कर सकते हैं:

update YourTable 
set col1 = (select 1 where 1=0) 

यह NULLs साथ col1 भर जाएगा। यदि सबक्वायरी कई पंक्तियां लौटाता है, जैसे:

update YourTable 
set col1 = (select 1 union select 2) 

डेटाबेस एक त्रुटि उत्पन्न करेगा।

दूसरा, पर यह एक बेहतर तरीका है इसे लिखें। मैं मूल रूप से तालिका तालिका में तीन फ़ील्ड को तालिका बी, से अपडेट कर रहा हूं लेकिन अपडेट केवल तभी होना चाहिए जब तीन फ़ील्ड में से कोई भी अलग हो।

सहजता से मैं प्रदर्शन के बारे में चिंता नहीं करता। क्या तुम सच में अद्यतन से बचने के लिए चाहते हैं, तो आप इसे पसंद लिख सकते हैं:

UPDATE a 
SET x = b.x, y = b.y, z = b.z 
FROM tableA a, tableB b 
WHERE a.id = b.id AND (a.x <> b.x OR a.y <> b.y OR a.z <> b.z) 

WHERE खंड शून्य के साथ अद्यतन रोकता है।

+0

यह शानदार दिखता है, सिवाय इसके कि, मैं उल्लेख करना भूल गया कि मैं सूचना आईडीएस 11.5 का उपयोग कर रहा हूं, और मैं नहीं मान लें कि informix अद्यतन में से समर्थन करता है या UPDATEs में शामिल हो जाता है। – rouble

+0

@prmatta: जानकारी मुझे अद्यतन में अद्यतन से समर्थन करता है; मैंने इनर जॉइन को हटा दिया है। – Andomar

+0

@Andomar, मुझे नहीं लगता कि यह करता है, कम से कम मेरा नहीं। दस्तावेज कहता है कि यह करता है, लेकिन मुझे एक वाक्यविन्यास त्रुटि मिल रही है। मैंने एसक्यूएल को बिना किसी चीज के अपडेट किया है और इसमें शामिल हो गया है और इसे एक जवाब के रूप में रखा है, मुझे बताएं कि यह आपके लिए अच्छा लग रहा है या नहीं। – rouble

0

इन्फोर्मिक्स पर मैं प्रयोग किया जाता है, Andomar के समाधान का एक परिवर्तन:

UPDATE a 
SET x,y,z = ((SELECT x, y, z 
       FROM tableB b 
       WHERE tableA.id = b.id)) 
WHERE tableA.id IN (SELECT fromTable.id 
        FROM tableA toTable, tableB fromTable 
        WHERE toTable.id = fromTable.id 
         AND ((toTable.x <> fromTable.x) 
          OR (toTable.y <> fromTable.y) 
          OR (toTable.z <> fromTable.z)) 
संबंधित मुद्दे