2012-11-20 18 views
20

मैं एक मेज table2 में से एक स्तंभ val2 करने के लिए एक मेज table1 में से एक स्तंभ val1 से सभी मूल्यों की प्रतिलिपि बनाना चाहते में एक और टेबल के एक स्तंभ के साथ एक मेज के एक स्तंभ अद्यतन करें। मैं PostgreSQL में इस आदेश की कोशिश की:PostgreSQL

update table2 
set val2 = (select val1 from table1) 

लेकिन मैं यह त्रुटि आई:

ERROR: more than one row returned by a subquery used as an expression

वहाँ ऐसा करने के लिए एक विकल्प है?

उत्तर

47

आपका UPDATE क्वेरी वास्तव में इस तरह दिखना चाहिए:

UPDATE table2 t2 
SET val2 = t1.val1 
FROM table1 t1 
WHERE t2.table2_id = t1.table2_id 
AND t2.val2 IS DISTINCT FROM t1.val1 -- optional, to avoid empty updates 

जिस तरह से आप यह था, वहाँ दो तालिकाओं के अलग-अलग पंक्तियों के बीच कोई संबंध नहीं था। table2 में प्रत्येक पंक्ति के लिए प्रत्येक पंक्ति table1 से प्राप्त की जाएगी। इसने कोई समझ नहीं लिया (एक महंगी तरीके से) और सिंटैक्स त्रुटि भी ट्रिगर की, क्योंकि इस जगह में एक सबक्वायरी अभिव्यक्ति केवल एक मान वापस करने की अनुमति है।

  • मैं table2_id पर दो तालिकाओं में शामिल होने से इस तय की। जो भी वास्तव में दोनों को जोड़ता है उसे बदलें।

  • मैं (FROM खंड के साथ) के बजाय सहसंबद्ध सबक्वेरी चलाने का table1 में शामिल होने के लिए UPDATE दुबारा लिखा, क्योंकि उस परिमाण के एक आदेश से नियमित रूप से तेजी से होता है।
    यह भी रोकता है कि table2.val2 को हटा दिया जाएगा जहां table1 में कोई मिलान पंक्ति नहीं मिली है। इसके बजाय, कुछ भी इस पंक्ति के साथ इस पंक्ति के साथ होता है।

  • आप FROM सूची में सभी चीजों को शामिल कर सकते हैं जिसमें आप एक सादे SELECT (एकाधिक टेबल या सबक्वायरीज़) में शामिल कर सकते हैं। जो व्यावहारिक रूप से हमेशा एक अच्छा विचार है (पूरी लागत, लेकिन कोई लाभ - - विदेशी अपवाद लागू) Per documentation:

  • अंतिम WHERE खंड अद्यतन कि कुछ भी नहीं बदलेगा रोकता है।
+0

यह बहुत अच्छा था, एक आकर्षण के रूप में काम किया। धन्यवाद! –

0

अद्यतन table1 सेट table1_column table2 table2 जहां table1_id = table2.id

  1. table1 के लिए अन्य नाम का उपयोग नहीं करते से = table2.column।
  2. टेबल तालिका 1, तालिका 2