तकनीकी रूप से , अपने कथन को सुधारने के लिए, आप LIMIT 1
. जोड़ सकते हैं सबक्वेरी में यह सुनिश्चित करने के लिए कि अधिकतम 1 पंक्ति लौटा दी जाए। इससे त्रुटि दूर हो जाएगी, आपका कोड अभी भी बकवास होगा।
... 'SELECT store_key FROM store LIMIT 1' ...
व्यावहारिक रूप से , आप पंक्तियों का मिलान करना चाहते हैं किसी तरह दूरस्थ तालिका store
. से एक मनमाना पंक्ति चुनने के बजाय अपनी स्थानीय तालिका की प्रत्येक पंक्ति को अपडेट करने के लिए customer
.
आपका प्रारंभिक प्रश्न पर्याप्त विवरण प्रदान नहीं करता है, इसलिए मैं मान रहा हूं एक टेक्स्ट कॉलम match_name
दोनों तालिकाओं में (और UNIQUE
store
. में ) इस उदाहरण के लिए:
... 'SELECT store_key FROM store
WHERE match_name = ' || quote_literal(customer.match_name) ...
लेकिन यह काम करने का एक बहुत ही महंगा तरीका है।
आदर्श रूप से , आप कथन को पूरी तरह से फिर से लिखते हैं।
UPDATE customer c
SET customer_id = s.store_key
FROM dblink('port=5432, dbname=SERVER1 user=postgres password=309245'
, 'SELECT match_name, store_key FROM store')
AS s(match_name text, store_key integer)
WHERE c.match_name = s.match_name
AND c.customer_id IS DISTINCT FROM s.store_key;
यह आपके मूल कथन में कई समस्याओं का समाधान करता है।
जाहिर है, मूल समस्या आपकी त्रुटि की ओर अग्रसर होना ठीक किया गया है।
FROM
. में अतिरिक्त संबंधों में शामिल होना आम तौर पर बेहतर होता है एक UPDATE
का खंड सहसंबंधित उपश्रेणियों को चलाने के बजाय कथन प्रत्येक व्यक्तिगत पंक्ति के लिए।
Dblink का उपयोग करते समय, उपरोक्त एक हजार गुना अधिक महत्वपूर्ण हो जाता है। आप dblink()
को कॉल नहीं करना चाहते हर एक पंक्ति के लिए, यह बेहद महंगा है . अपनी ज़रूरत की सभी पंक्तियों को पुनः प्राप्त करने के लिए इसे एक बार कॉल करें।
सहसंबद्ध उपश्रेणियों के साथ, यदि कोई पंक्ति नहीं मिली सबक्वायरी में, कॉलम न्यूल में अपडेट हो जाता है, जो लगभग हमेशा आप जो चाहते हैं वह नहीं होता है। मेरी अद्यतन क्वेरी में, मिलान पंक्ति मिलने पर ही पंक्ति अपडेट हो जाती है। अन्यथा, पंक्ति को छुआ नहीं जाता है।
आम तौर पर, आप पंक्तियों को अपडेट नहीं करना चाहेंगे, जब वास्तव में कुछ भी नहीं बदलता है। वह महंगा रूप से कुछ नहीं कर रहा है (लेकिन अभी भी मृत पंक्तियों का उत्पादन करता है)। WHERE
. में अंतिम व्यंजक क्लॉज ऐसे खाली अपडेट . को रोकता है :
AND c.customer_id IS DISTINCT FROM sub.store_key
संबंधित:
- मैं कैसे (या मैं कर सकता हूं) एकाधिक स्तंभों पर DISTINCT का चयन कैसे करूं?