2011-02-09 7 views
9

WHERE क्लॉज के विपरीत, इसमें शामिल होने में फ़िल्टर करने के लिए कोई तर्क, प्रदर्शन के अनुसार, क्या कोई तर्क है?शामिल होने पर फ़िल्टरिंग?

उदाहरण के लिए

,

SELECT blah FROM TableA a 
INNER JOIN TableB b 
ON b.id = a.id 
AND b.deleted = 0 
WHERE a.field = 5 

रूप

SELECT blah FROM TableA a 
INNER JOIN TableB b 
ON b.id = a.id 
WHERE a.field = 5 
    AND b.deleted = 0 

करने का विरोध किया मैं व्यक्तिगत रूप से, बाद पसंद करते हैं क्योंकि मुझे लगता है छानने छानने धारा (कहां) में किया जाना चाहिए, लेकिन वहाँ किसी भी प्रदर्शन है या किसी भी तरीके से करने के अन्य कारण?

+0

जॉइन का उपयोग करते समय [कहां क्लॉज बनाम चालू] का डुप्लिकेट (https://stackoverflow.com/questions/10297231/where-clause-vs-on-when-using-join) (हाँ, इसमें समय यात्रा शामिल है लेकिन एक नज़र में थोड़ा बेहतर जवाब है) –

उत्तर

17

यदि क्वेरी ऑप्टिमाइज़र अपना काम करता है, तो आंतरिक रूप से जुड़ने के लिए दो रूपों में कोई अंतर नहीं है (दूसरों के लिए स्पष्टता को छोड़कर)।

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

+4

+1। अंतर को इंगित करने के लिए –

+0

+1 एसक्यूएल प्रोफाइलर रिपोर्ट – kelloti

0

मुझे लगता है कि यह आपके लिए क्या देख रहे >>SQL join: where clause vs. on clause

+0

पढ़ने की बिल्कुल वही संख्या रिपोर्ट करता है यदि आपको लगता है कि प्रश्न एक डुप्लिकेट है, तो कृपया केवल एक लिंक को जोड़ने के बजाय इसे एक के रूप में चिह्नित करें, जो स्वयं की कोई सामग्री प्रदान नहीं करता है। –

0

नहीं वहाँ इन दोनों के बीच कोई मतभेद नहीं है, क्योंकि क्वेरी के तार्किक प्रसंस्करण में, WHERE हमेशा सही फिल्टर खंड (ON) के बाद जाना होगा है अपने उदाहरण में आप होगा:

  1. कार्तीय उत्पाद
  2. फ़िल्टर (ON)
  3. कहाँ (TableB से पंक्तियों की TableA एक्स नंबर से पंक्तियों की संख्या)।

    SELECT blah FROM TableA a,TableB b 
    WHERE b.id = a.id AND b.deleted = 0 AND a.field = 5 
    

    यह सच है के लिए इनर शामिल होता है, बाहरी कार्यभार संभाला के साथ है:

आपका उदाहरण एएनएसआई SQL-92 मानक में हैं, तो आप भी इस तरह ANSI SQL-89 मानक के साथ क्वेरी लिख सकता है समान लेकिन

0

आंतरिक जुड़ने के साथ आपके पास एक ही परिणाम और शायद एक ही प्रदर्शन होगा। हालांकि, बाहरी प्रश्नों के साथ दो प्रश्न अलग-अलग परिणाम लौटाएंगे और इस शर्त को इस स्थिति में डालने के बराबर नहीं होंगे कि किस स्थिति में संक्षेप में बाएं से क्वेरी को आंतरिक जुड़ने में शामिल किया जाएगा (जब तक कि आप उन रिकॉर्ड्स की तलाश नहीं कर रहे हों, जहां कुछ क्षेत्र शून्य है)।