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 द्वारा क्वेरी संकेतों पर एक विस्तृत ब्लॉग है। पाँच साल पुराना है लेकिन फिर भी मान्य है।