2010-04-24 7 views
8

मैंने हमेशा एसक्यूएल में दो तालिकाओं के बीच किसी तरह के संबंध के रूप में शामिल होने का विचार किया।एसक्यूएल में, एक जॉइन वास्तव में एक छेड़छाड़ है? और यह एक जुड़ाव या "सिडवे संघ" भी है?

उदाहरण के लिए,

select e.name, d.name from employees e, departments d 
    where employees.deptID = departments.deptID 

इस मामले में, यह दो तालिकाओं लिंक हो रहा है, एक विभाग आईडी एक विभाग नाम के बजाय साथ प्रत्येक कर्मचारी को दिखाने के लिए। और एक तरह से एक "कड़ी" या "संघ" sideway "।

लेकिन, के बारे में आंतरिक सीखने के बाद की तरह बाहरी बनाम में शामिल होने के शामिल हो, यह पता चलता है कि एक के साथ जुड़ें (इनर में शामिल होने) वास्तव में एक चौराहे है।

उदाहरण के लिए जब एक तालिका आईडी 1, 2, 7, 8, है, जबकि एक अन्य तालिका आईडी 7 और केवल 8 है, जिस तरह से हम चौराहे मिलता है:

select * from t1, t2 where t1.ID = t2.ID 

"7 के दो रिकॉर्ड प्राप्त करने के लिए और 8 "। तो यह वास्तव में एक चौराहे है।

तो हमारे पास 2 टेबलों का" छेड़छाड़ "है। 2 टेबल पर "संघ" ऑपरेशन के साथ है। क्या एक जॉइन को "छेड़छाड़" के रूप में सोचा जा सकता है? लेकिन इसके "लिंकिंग" या "सिडवे यूनियन" पहलू के बारे में क्या?

उत्तर

9

यहां जेफ से visual explanation of SQL joins है जो आपके कुछ प्रश्नों का उत्तर दे सकता है।

+2

यह एक व्यापक रूप से भ्रामक छवि है ... यह और अधिक सटीक http://imgur.com/2mlaF1M – Arnon

2

एक 'लिंक' या erm में शामिल हों ... दो तालिकाओं से पंक्तियों में शामिल हो जाता है। मुझे लगता है कि 'अलगाव संघ' का मतलब है कि मैं व्यक्तिगत रूप से सोचता हूं कि यह वाक्यांश का एक भयानक तरीका है। लेकिन विभिन्न प्रकार के जॉइन हैं जो थोड़ा अलग काम करते हैं:

  • एक आंतरिक जुड़ाव वास्तव में एक चौराहे है।
  • एक पूर्ण बाहरी जुड़ाव एक संघ है।

जेफ एटवुड के ब्लॉग पर यह page अन्य संभावनाओं का वर्णन करता है।

+0

मान लीजिए, यदि दोनों तालिकाओं मिलान करने वाले सभी deptIDs है, तो दो तालिकाओं कंधे से कंधा मिलाकर विलय कर दिया, उस अर्थ में यह है एक "अलगाव संघ" की तरह –

+1

@ जियान लिन: यदि यह आपके लिए 'किनारे संघ' के रूप में सोचने के लिए आसान बनाता है, तो ठीक है, लेकिन यूनियन के पास एसक्यूएल में एक अच्छी तरह से परिभाषित अर्थ है और ऐसा नहीं है। मैं अन्य लोगों से बात करते समय उस शब्द का उपयोग करने से बचूंगा। –

5

आप सही रास्ते पर हैं; INNER JOIN द्वारा लौटाई गई पंक्तियां वे हैं जो शामिल स्थितियों को पूरा करती हैं। लेकिन यह केवल एक चौराहे की तरह है क्योंकि आप अपनी स्थिति में समानता का उपयोग कर रहे हैं, प्रत्येक तालिका से कॉलम पर लागू होते हैं।

यह भी ध्यान रखें कि INTERSECTION पहले से ही एक SQL ऑपरेशन है और इसका दूसरा अर्थ है - और यह JOIN जैसा नहीं है।

एक एसक्यूएल JOIN एक नई प्रकार की पंक्ति उत्पन्न कर सकता है, जिसमें दोनों शामिल कॉलम से सभी कॉलम हैं। उदाहरण के लिए: col4, col5, और col6 तालिका एक में मौजूद नहीं है, लेकिन किसी तालिका बी के साथ एक में शामिल होने के परिणाम में मौजूद है:

SELECT a.col1, a.col2, a.col3, b.col4, b.col5, b.col6 
FROM A INNER JOIN B ON a.col2=b.col5; 

एक एसक्यूएल INTERSECTION पंक्तियों को दो अलग-अलग तालिकाओं के लिए आम हैं रिटर्न , जो पहले से ही समान कॉलम होना चाहिए।

SELECT col1, col2, col3 FROM A 
INTERSECT 
SELECT col1, col2, col3 FROM B; 

यह एक ही परिणाम का उत्पादन करने के लिए होता के रूप में निम्नलिखित शामिल हो:

SELECT a.col1, a.col2, a.col3 
FROM A INNER JOIN B ON a.col1=b.col1 AND a.col2=b.col2 AND a.col3=b.col3; 

नहीं डेटाबेस के हर ब्रांड INTERSECTION ऑपरेटर का समर्थन करता है।

0

एक बाहरी जुड़ाव - संघ या संघ सभी से संबंधित नहीं है।

उदाहरण के लिए, यूनियन या यूनियन ऑल ऑपरेशन के परिणामस्वरूप 'शून्य' नहीं होगा, लेकिन यह बाहरी जुड़ाव के परिणामस्वरूप होता है।

0

INNER JOIN दो NULL एस दो अलग-अलग मानों के रूप में व्यवहार करता है। इसलिए, यदि आप एक शून्य कॉलम के आधार पर शामिल होते हैं, और यदि दोनों तालिकाओं में उस कॉलम में NULL मान हैं, तो INNER JOIN उन पंक्तियों को अनदेखा कर देगा।

इसलिए, दो टेबल, INTERSECT के बीच सभी सामान्य पंक्तियों को सही ढंग से पुनर्प्राप्त करने के लिए उपयोग किया जाना चाहिए। INTERSECT एक ही मूल्य के रूप में दो NULL एस का इलाज करता है।

उदाहरण (SQLite):

नल कॉलम के साथ दो तालिकाओं बनाएँ:

CREATE TABLE Table1 (id INT, firstName TEXT); 
CREATE TABLE Table2 (id INT, firstName TEXT); 

सम्मिलित NULL मान:

INSERT INTO Table1 VALUES (1, NULL); 
INSERT INTO Table2 VALUES (1, NULL); 

पुनः प्राप्त आम पंक्तियों INNER JOIN का उपयोग कर (यह कोई उत्पादन से पता चलता):

SELECT * FROM Table1 INNER JOIN Table2 ON 
    Table1.id=Table2.id AND Table1.firstName=Table2.firstName; 

INTERSECT का उपयोग करके सामान्य पंक्तियों को पुनः प्राप्त (यह सही ढंग से आम पंक्ति दिखाती है):

SELECT * FROM Table1 INTERSECT SELECT * FROM Table2; 

निष्कर्ष:

हालांकि यहां तक ​​कि कई बार दोनों INTERSECT और INNER JOINsame results प्राप्त करने के लिए इस्तेमाल किया जा सकता , वे समान नहीं हैं और स्थिति के आधार पर उठाए जाने चाहिए।

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