बाहरी जुड़ने के साथ अंतर से सावधान रहें। एक क्वेरी जहां b.IsApproved
के एक फिल्टर (सही मेज पर, बार) JOIN
की ON
हालत में जोड़ा जाता है:
:
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);
नहींWHERE
खंड में फिल्टर देना एक ही है
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved = 1);
'विफल' के लिए के बाद से बाहरी Bar
(यानी जहां एक f.BarId
के लिए कोई b.BarId
है), इस b.IsApproved
NULL
के रूप में इस तरह के सभी पिता के लिए छोड़ देंगे करने के लिए मिलती है उबला हुआ पंक्तियां, और इन पंक्तियों को फिर फ़िल्टर किया जाएगा।
इस को देखने का एक और तरीका है कि पहले प्रश्न के लिए, LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId)
हमेशा बाईं तालिका पंक्तियों वापस आ जाएगी, क्योंकि LEFT OUTER JOIN
की गारंटी देता है वाम तालिका पंक्तियों भले ही में शामिल होने में विफल रहता है लौटा दी जाएगी है। हालांकि, (b.IsApproved = 1)
को LEFT OUTER JOIN
पर LEFT OUTER JOIN
पर जोड़ने के प्रभाव को (b.IsApproved = 1)
पर कोई सही तालिका कॉलम न्यूल करना है, यानी पर सामान्य रूप से LEFT JOIN
स्थिति पर लागू नियमों के अनुसार।
अद्यतन: सवाल कॉनराड द्वारा पूछे जाने पर पूरा करने के लिए, एक वैकल्पिक फिल्टर के लिए बराबर LOJ होगा:
यानी
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved IS NULL OR b.IsApproved = 1);
WHERE
खंड में शामिल होने के लिए कि क्या दोनों की हालत पर विचार करने की जरूरत है (NULL)
विफल रहता है और फिल्टर को अनदेखा किया जाना है, और जहां शामिल हो जाता है और फ़िल्टर लागू किया जाना चाहिए।(b.IsApproved
या b.BarId
NULL
के लिए परीक्षण किया जा सकता है)
मैं एक SqlFiddle together here जो JOIN
को b.IsApproved
फिल्टर रिश्तेदार के विभिन्न प्लेसमेंट के बीच मतभेदों को दर्शाता है डाल दिया।
यहां एक समान प्रश्न है: http://stackoverflow.com/questions/2509987/which-sql-query-is-faster-filter-on-join-criteria-or-where-clause –
मशीन इसे समझ लेगी और इसे ठीक से अनुकूलित करें। हालांकि, उन मनुष्यों के लिए जिन्हें अब से आपके कोड वर्षों को \ संशोधित \ संशोधित करने की आवश्यकता होगी, फ़िल्टरिंग शर्तों को 'WHERE' में रखें और 'ON' में स्थितियों में शामिल हों। –
@ केएम। मैं हमेशा यह नहीं जानता कि कैसे जुड़ाव की स्थिति और फ़िल्टर क्या है, के बीच अंतर कैसे बताना है। उदाहरण के लिए [इस उत्तर में] (http://stackoverflow.com/a/9303069/119477) मुझे लगता है कि इसमें शामिल होने में बेहतर यह है कि "स्थिति में शामिल हों" तो? [यहां एक और उदाहरण है] (http://stackoverflow.com/a/6473403/119477) जो मुझे यह भी नहीं पता कि समकक्ष जहां समकक्ष को फिर से लिखना है। –