WHERE

2009-12-15 14 views
11

के बजाय जॉइन का उपयोग करके फ़िल्टरिंग एसक्यूएल (एमएसएसएलएल, ओरेकल, इत्यादि, जो भी हो) में, टेबल में शामिल होने पर, WHERE क्लॉज में होने के बजाय जॉइन स्टेटमेंट में फ़िल्टर जोड़ने से लाभ क्या होता है?WHERE

यानी

SELECT * FROM X INNER JOIN Y ON X.A = Y.A WHERE X.B = 'SOMETHING' 

बनाम

SELECT * FROM X INNER JOIN Y ON X.A = Y.A AND X.B = 'SOMETHING' 

मुझे लगता है कि यह सभी मामलों में काम नहीं करता है, लेकिन मैंने देखा है कुछ मामलों में डाल कर उनका प्रदर्शन लाभ प्रतीत होता है कि जॉइन स्टेटमेंट में फ़िल्टर मानदंड। हालांकि, चूंकि यह जॉइन स्टेटमेंट का हिस्सा है, इसलिए यह थोड़ा अजीब तरीके से व्यवहार कर सकता है।

विचार?

+0

डुप्लिकेट: http://stackoverflow.com/questions/1018952/condition-within-join-or-where –

उत्तर

5

INNER JOIN प्रश्नों के लिए, इन फ़िल्टरों की प्रदर्शन विशेषताओं कई कारकों पर निर्भर करती है - तालिकाओं का आकार, अनुक्रमण, क्वेरी की चयनकता, और आरडीबीएमएस के लिए विशिष्ट अन्य कारकों पर क्वेरी निष्पादित की जाती है।

LEFT और RIGHT OUTER JOIN में, INNER JOIN तुलना में बहुत अधिक फिल्टर मामलों की स्थिति, के बाद से प्रभावित करता है कि क्या यह पहले (JOIN खंड) लागू कर दिया जाएगा या के बाद (WHERE खंड) में शामिल होने के किया जाता है।

+2

अन्य शब्दों में, एक बाहरी जॉइन के ऑन क्लॉज में फ़िल्टर WHERE क्लॉज में इसे शामिल करने से अलग-अलग परिणाम उत्पन्न कर सकता है। – APC

+1

'बाहरी जॉइन 'के' WHERE' खंड पर समानता फ़िल्टर सहित प्रभावी रूप से इसे 'इनर जॉइन' बनाता है। – Quassnoi

5

मैं कभी-कभी उन प्रश्नों में ऐसा करता हूं जिनमें बहुत से लोग शामिल होते हैं क्योंकि यह शामिल होने की स्थिति में कुछ और कुछ कहां से कुछ में शामिल होने के बजाय क्वेरी के एक हिस्से में शामिल होने के बारे में सारी जानकारी को स्थानांतरित करता है।

+2

यह भी है कि मैं इसका उपयोग कैसे करता हूं: चयन से अलग मॉडेल (शामिल) (जहां) – lexu

3

एक इंटर्नर जॉइन के लिए, मुझे प्रदर्शन अंतर की उम्मीद नहीं होगी, बल्कि यह कि एक ही योजना का उपयोग किया जाएगा चाहे फ़िल्टर जॉइन में था ... क्लॉज या WHERE क्लॉज पर। मैं व्यक्तिगत रूप से जॉइन क्लॉज में शामिल मानदंडों और WHERE क्लॉज में फ़िल्टरिंग लिखना पसंद करता हूं- एक ही स्थान पर SQL कथन में सभी "पैरामीटर" को छूने का एक तरीका- यह आवश्यक रूप से समझदार या अच्छी तरह से नहीं है- सावधानीपूर्वक विचार किया। इसके विपरीत, कुछ लोगों को सब कुछ एक साथ रखने के लिए जॉइन क्लॉज में सबकुछ रखना पसंद है।

बाहरी जोड़ों की स्थिति अलग है- "एक बाएं बाहरी जॉइन बी पर a.a_id = b.a_id और b.type = 1" और "बाएं आउटर बी पर a.a_id पर एक महत्वपूर्ण अंतर है = b.a_id जहां b.type = 1 "- वास्तव में उत्तरार्द्ध एक आंतरिक शामिल होने के लिए मजबूती से मजबूर कर रहा है। स्थिरता के लिए, जॉइन क्लॉज में ऐसी सभी स्थितियों को रखने का यह एक और कारण होगा।

2

ये वाक्यविन्यास समानार्थी हैं और अधिकांश RDBMS द्वारा एक ही चीज़ के लिए अनुकूलित किए गए हैं।

मैं आमतौर पर इस वाक्य रचना पसंद करते हैं:

SELECT * 
FROM X 
INNER JOIN 
     Y 
ON  X.A = Y.A 
WHERE X.B = 'SOMETHING' 

जब BA और B के बीच तार्किक लिंक का हिस्सा नहीं है, और यह एक:

SELECT * 
FROM X 
INNER JOIN 
     Y 
ON  X.A = Y.A 
     AND X.B = 'SOMETHING' 

जब यह है।

0

स्पष्टता और अर्थ को छोड़कर कुछ भी नहीं। जब तक आप बाहरी शामिल नहीं हो जाते हैं।

0

एक मानव (एक ऑप्टिमाइज़र के बजाए) के रूप में, एक क्वेरी को बनाए रखने पर, मैं JOIN खंड और WHERE खंड में एक खोज स्थिति में शामिल होने की स्थिति की तलाश करता हूं।

बेशक, आपको प्रदर्शन समस्याओं और कोड रखरखाव के मुद्दों के बीच संतुलन को रोकने की आवश्यकता है। हालांकि, मेरी पहली प्राथमिकता पहले उदाहरण में अच्छा लॉजिकल कोड है, फिर आवश्यकतानुसार अनुकूलित करें।

संबंधित मुद्दे