आपका 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, see below
जिस तरह से आपके पास था, दो तालिकाओं की अलग-अलग पंक्तियों के बीच कोई लिंक नहीं था। प्रत्येक पंक्ति table1
. से प्राप्त की जाएगी table2
. में प्रत्येक पंक्ति के लिए . इसका कोई मतलब नहीं था (महंगे तरीके से) और सिंटैक्स त्रुटि को भी ट्रिगर किया, क्योंकि इस जगह में एक सबक्वेरी एक्सप्रेशन को केवल एक मान वापस करने की अनुमति है।
मैंने table2_id
. पर दो तालिकाओं को जोड़कर इसे ठीक किया . उसे बदलें जो वास्तव में दोनों को जोड़ता है।
मैंने UPDATE
को फिर से लिखा table1
. में शामिल होने के लिए (FROM
. के साथ क्लॉज) सहसंबद्ध उपश्रेणियों को चलाने के बजाय, क्योंकि यह आमतौर पर परिमाण के क्रम से तेज़ होता है।
यह table2.val2
को भी रोकता है। जहां table1
. में कोई मेल खाने वाली पंक्ति नहीं मिलती है, वहां शून्य कर दिया जाएगा . इसके बजाय, कुछ नहीं क्वेरी के इस रूप के साथ ऐसी पंक्तियों के साथ होता है।
आप FROM
में टेबल एक्सप्रेशन जोड़ सकते हैं एक सादे SELECT
. की तरह सूची (टेबल, सबक्वेरी, सेट-रिटर्निंग फंक्शन, ...) मैनुअल:
from_list
तालिका अभिव्यक्तियों की एक सूची, अन्य तालिकाओं के स्तंभों को
WHERE
. में प्रदर्शित होने की अनुमति देती है स्थिति और अद्यतन अभिव्यक्तियाँ। यह उन तालिकाओं की सूची के समान है जिन्हेंFROM
. में निर्दिष्ट किया जा सकता है एकSELECT
का खंड बयान। ध्यान दें कि लक्ष्य तालिकाfrom_list
. में प्रकट नहीं होनी चाहिए , जब तक कि आप स्वयं शामिल होने का इरादा नहीं रखते (जिस स्थिति में यहfrom_list
में किसी अन्य नाम के साथ दिखाई देना चाहिए) )।
अंतिम WHERE
खंड उन अद्यतनों को रोकता है जो कुछ भी नहीं बदलेंगे - जो व्यावहारिक रूप से हमेशा एक अच्छा विचार है (लगभग पूर्ण लागत लेकिन कोई लाभ नहीं, विदेशी अपवाद लागू होते हैं)। यदि पुराने और नए दोनों मान NOT NULL
होने की गारंटी हैं , इसे सरल करें:
AND t2.val2 <> t1.val1
- मैं कैसे (या मैं कर सकता हूं) एकाधिक स्तंभों पर DISTINCT का चयन कैसे करूं?