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

PostgreSQL:LEFT JOIN में AND स्टेटमेंट का उपयोग अपेक्षा के अनुरूप काम नहीं कर रहा है

LEFT JOIN . को लेकर भ्रम और WHERE खंड को कई बार स्पष्ट किया गया है:

यह दिलचस्प सवाल अवशेष:

Postgres में कोई स्पष्ट क्वेरी संकेत नहीं हैं। (जो चल रही बहस का विषय है।) लेकिन पोस्टग्रेज़ को अपना रास्ता मोड़ने के लिए अभी भी कई तरकीबें हैं।

लेकिन पहले, खुद से पूछें: प्रश्न योजनाकार ने शुरुआत में चुनी हुई योजना के सस्ते होने का अनुमान क्यों लगाया? क्या आपका सर्वर कॉन्फ़िगरेशन मूल रूप से समझदार है? लागत सेटिंग्स पर्याप्त हैं? autovacuum दौड़ना? पोस्टग्रेज संस्करण पुराना है? क्या आप एक अंतर्निहित समस्या के आसपास काम कर रहे हैं जिसे वास्तव में ठीक किया जाना चाहिए?

यदि आप Postgres को इसे अपने तरीके से करने के लिए बाध्य करते हैं, तो आपको यह सुनिश्चित करना चाहिए कि संस्करण अपग्रेड या सर्वर कॉन्फ़िगरेशन में अपडेट होने के बाद, यह वापस सक्रिय नहीं होगा ... आप बेहतर जानते होंगे कि आप वास्तव में क्या कर रहे हैं।

उस ने कहा, आप कर सकते हैं पोस्टग्रेज़ को "JOIN करने से पहले कुछ रिकॉर्ड को फ़िल्टर करने के लिए बाध्य करें " एक सबक्वेरी के साथ जहां आप OFFSET 0 add जोड़ते हैं - जो तार्किक रूप से सिर्फ शोर है, लेकिन पोस्टग्रेज को इसे नियमित जुड़ाव के रूप में पुनर्व्यवस्थित करने से रोकता है। (आखिरकार क्वेरी संकेत)

SELECT la.listing_id, la.id, lar.*
FROM  (
   SELECT listing_id, id
   FROM   la
   WHERE  listing_id = 2780
   OFFSET 0
   ) la
LEFT   JOIN lar  ON lar.application_id = la.id;

या आप एक सीटीई (कम अस्पष्ट, लेकिन अधिक महंगा) का उपयोग कर सकते हैं। या अन्य तरकीबें जैसे कुछ कॉन्फिग पैरामीटर सेट करना। या, इस विशेष मामले में, मैं LATERAL का उपयोग करूंगा एक ही प्रभाव में शामिल हों:

SELECT la.listing_id, la.id, lar.*
FROM   la
LEFT  JOIN LATERAL (
   SELECT *
   FROM   lar
   WHERE  application_id = la.id
   )  lar ON true
WHERE  la.listing_id = 2780;

संबंधित:

यहाँ 2ndQuadrant द्वारा क्वेरी संकेतों पर एक विस्तृत ब्लॉग है। पाँच साल पुराना है लेकिन फिर भी मान्य है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. दृश्य पर ट्रिगर निष्पादित करें?

  2. एक ही क्वेरी में एकाधिक array_agg () कॉल

  3. क्या मैं मौजूदा साइटस टेबल पर वितरण विधि बदल सकता हूँ?

  4. SQLAlchemy में जटिल विदेशी कुंजी बाधा

  5. Django विशिष्ट काम नहीं कर रहा