बाहरी जुड़ाव के साथ अंतर से सावधान रहें। एक क्वेरी जहां b.IsApproved
. का फ़िल्टर (दाईं मेज पर, बार) को ON
. में जोड़ा जाता है JOIN
. की शर्त :
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
से जुड़ता है (अर्थात जहां कोई b.BarId
. नहीं है एक f.BarId
. के लिए ), यह b.IsApproved
. छोड़ देगा NULL
. के रूप में ऐसी सभी विफल पंक्तियों के लिए, और फिर इन पंक्तियों को फ़िल्टर कर दिया जाएगा।
इसे देखने का दूसरा तरीका यह है कि पहली क्वेरी के लिए, LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId)
LEFT OUTER JOIN
. के बाद से हमेशा LEFT तालिका पंक्तियों को लौटाएगा गारंटी देता है कि शामिल होने में विफल होने पर भी LEFT तालिका पंक्तियों को वापस कर दिया जाएगा। हालांकि, जोड़ने का प्रभाव (b.IsApproved = 1)
LEFT OUTER JOIN
. के लिए शर्त यह है कि (b.IsApproved = 1)
. पर किसी भी सही टेबल कॉलम को खाली कर दिया जाए गलत है, अर्थात समान नियमों के अनुसार जो आमतौर पर LEFT JOIN
. पर लागू होते हैं (b.BarId = f.BarId)
. पर शर्त ।
अपडेट करें :कॉनराड द्वारा पूछे गए प्रश्न को पूरा करने के लिए, वैकल्पिक फ़िल्टर के लिए समतुल्य 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 को एक साथ रखा है जो b.IsApproved
के विभिन्न प्लेसमेंट के बीच अंतर को प्रदर्शित करता है। JOIN
. के सापेक्ष फ़िल्टर करें ।