Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

जॉइन का उपयोग करते समय क्लॉज बनाम चालू कहां है

बाहरी जुड़ाव के साथ अंतर से सावधान रहें। एक क्वेरी जहां 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 . के सापेक्ष फ़िल्टर करें ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर एजेंट अलर्ट

  2. मैं एकाधिक कॉलम में डुप्लीकेट कैसे ढूंढूं?

  3. अंतर जानने के लिए लिनक्स बनाम विंडोज परफॉर्मेंस टेस्ट पर एमएस एसक्यूएल सर्वर

  4. क्या Microsoft SQL सर्वर पर SQL क्वेरी के लिए टाइमआउट सेट करना संभव है?

  5. T-SQL का उपयोग करके SQL सर्वर डेटाबेस का बैकअप कैसे लें