2012-09-13 10 views
18

SQL विवरण।अंतर "पर .. और" और "पर .. जहां" एसक्यूएल वाम में शामिल हों?

1.select a.* from A a left join B b on a.id =b.id and a.id=2; 

2.select a.* from A a left join B b on a.id =b.id where a.id=2; 

इन दो वर्ग स्टेटमेंट का अंतर क्या है?

+1

http://stackoverflow.com/questions/10297231/where-clause-vs-on-when-using-join – Habib

+4

कोई डुप्लिकेट नहीं है, जिसमें 'बाएं जॉइन' होने से कोई सवाल महत्वपूर्ण रूप से बदलता है। – hvd

+1

@hvd - प्रश्न सटीक डुप्लीकेट नहीं हो सकते हैं, लेकिन चूंकि अधिकांश उत्तर "इनर जॉइन 'के लिए कोई फर्क नहीं पड़ता है, लेकिन यहां' बाहरी जॉइन 'के लिए अलग-अलग होगा ... " –

उत्तर

23
create table A(id int); 
create table B(id int); 

INSERT INTO A VALUES(1); 
INSERT INTO A VALUES(2); 
INSERT INTO A VALUES(3); 

INSERT INTO B VALUES(1); 
INSERT INTO B VALUES(2); 
INSERT INTO B VALUES(3); 

SELECT * FROM A; 
SELECT * FROM B; 

id 
----------- 
1 
2 
3 

id 
----------- 
1 
2 
3 

शामिल हों प्रक्रिया के दौरान शामिल होने से रोकने के लिए पंक्तियों में शामिल हों पर फ़िल्टर।

select a.*,b.* 
from A a left join B b 
on  a.id =b.id and a.id=2; 

id   id 
----------- ----------- 
1   NULL 
2   2 
3   NULL 

जॉइन होने के बाद फ़िल्टर किया जाएगा।

select a.*,b.* 
from A a left join B b 
on  a.id =b.id 
where a.id=2; 

id   id 
----------- ----------- 
2   2 
+0

आपके विवरण के लिए धन्यवाद –

+0

@ jack.li खुश आपकी मदद करने के लिए :) –

+0

किसी कारण से यह इस sqlfiddle में अपेक्षित काम नहीं करता है: http://sqlfiddle.com/#!2/9684d/4 लेकिन जब मैंने इसे MySQL में करने की कोशिश की तो यह ठीक उसी तरह काम करता था जैसा आपने कहा था। –

8

a.id = b.id और a.id = 2 पर एक बी बी एक छोड़ दिया में शामिल होने से एक का चयन करें *।

यह केवल, हालत में शामिल होने में a.id उपयोग करता है ताकि रिकॉर्ड जहां a.id <> 2 फिल्टर करके निकाल नहीं मिलता। आप इस प्रकार का परिणाम प्राप्त हो सकता है:

 
+------+------+ 
| a.id | b.id | 
+------+------+ 
| 1 | NULL | 
| 2 | 2 | 
| 3 | NULL | 
+------+------+ 

आप b के स्तंभों में से किसी का चयन नहीं करते हैं, लेकिन अगर आप ऐसा करेंगे, यह समझने के लिए आसान होगा।

ए से एक बाएं बी * बी में बी बी में शामिल हों, जहां a.id = 2;

अब रिकॉर्ड है जहां a.id <> 2 फिल्टर करके निकाल दिए जाते हैं।

 
+------+------+ 
| a.id | b.id | 
+------+------+ 
| 2 | 2 | 
+------+------+ 
0

@hvd के रूप में, कहते हैं, "जहाँ" खंड में शामिल होने के द्वारा दिया पंक्तियों फिल्टर, इसलिए "कहाँ" संस्करण नहीं लौटेगा बाहरी-में शामिल हो गए पंक्तियों (जो है a.id = नल)।

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

यह विशेष रूप से उच्चारण किया जाता है जब अन्य बाएं समूह की एक श्रृंखला "और" स्थिति के साथ एक के बाद होती है - आप अनुपयुक्त पंक्तियों के लिए निम्न तालिकाओं में भी शामिल होने से जुड़ सकते हैं और संभावित रूप से लाखों पंक्तियों तक पहुंचने से रोक सकते हैं फिल्टरिंग ("कहाँ") चरण।

0

मैं कुछ समय के लिए प्रयास करें, और मुझे पता है कि कारण, यह केवल एक प्राथमिकता से संबंधित है।

select * from A a left join B b on a.id=b.id and b.id=2 

इसका मतलब है एक बाएं में शामिल होने के (जहां b.id = 2) इस हालत फिल्टर बी पहला है

Select * from A a left join B b on a.id=b.id where a.id=2 

इस के बाद, बी में शामिल होने तो a.id द्वारा = 2

को फिल्टर का मतलब
0

आप किसी SQL क्वेरी के सिंटैक्स के बारे में सोचते हैं, तो 'और' में शामिल होने के ब्लॉक फैली (जैसे कि जहां कोष्ठक) जहां के रूप में 'WHERE' क्वेरी के WHERE/छानने ब्लॉक के शुरू होने से परिभाषित करता है।

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