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

पोस्टग्रेज त्रुटि:एक अभिव्यक्ति के रूप में उपयोग की जाने वाली सबक्वेरी द्वारा लौटाई गई एक से अधिक पंक्तियाँ

तकनीकी रूप से , अपने कथन को सुधारने के लिए, आप 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 का चयन कैसे करूं?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL आईडी अनुक्रम सिंक से बाहर क्यों जाते हैं (विशेष रूप से पोस्टग्रेज़ का उपयोग करके)?

  2. लुमेन - रनटाइम पर डेटाबेस कनेक्शन बनाएं

  3. DB2 से PostgreSQL में माइग्रेट करना - आपको क्या पता होना चाहिए

  4. पोस्टग्रेएसक्यूएल परिनियोजन और रखरखाव के साथ Ansible

  5. लूप के लिए पोस्टग्रेज