2011-05-03 15 views
24

मुझे बाएं बाहरी जुड़ने की अवधारणा, सही बाहरी शामिल होने की अवधारणा को समझ में नहीं आता है, या वास्तव में हमें इसमें शामिल होने की आवश्यकता क्यों है! सवाल मैं के साथ संघर्ष कर रहा हूँ और मेज मैं से काम कर रहा हूँ यहाँ है: Linkबाएं बाहरी शामिल होने का उपयोग कब करें?

प्रश्न 3 (ख)

, निम्न क्वेरी हल करने के लिए SQL में एक आदेश का निर्माण का कारण बताते हुए यह काम किया था (बाहरी) विधि में शामिल हों। [5 मार्क्स]

प्रश्न 3 (ग) "प्रत्येक स्टाफ सदस्य का नाम और उसका/उसकी आश्रित पति, यदि कोई हो का पता लगाएं" -

SQL में एक आदेश का निर्माण निम्न क्वेरी हल करने के लिए, (i) जॉइन विधि का उपयोग करके, और (ii) सबक्वायरी विधि। [10 अंक] " कम्प्यूटरीकरण प्रोजेक्ट पर 20 घंटे से अधिक समय तक काम करने वाले प्रत्येक स्टाफ सदस्य का पहचान नाम ढूंढें"

क्या कोई मुझे बस यह समझा सकता है?

+1

इसकी "अगर कोई है" ... बाएं बाहरी जॉइन बाएं जुड़ने के समान हैं (mysql में) और आप पंक्तियों को वापस करने के लिए उनका उपयोग करते हैं, भले ही वे किसी अन्य तालिका में पंक्तियों से मेल नहीं खाते हैं। – Diego

+0

और साथ ही, आपको एक जॉइन का उपयोग करने की आवश्यकता है क्योंकि यह बहुत ही सरल है, डेटाबेस क्वेरी कैसे काम करती है। यह पूछने की तरह है कि हमें श्वास लेने के लिए फेफड़ों का उपयोग करने की आवश्यकता क्यों है। जुड़ता है वह तंत्र है जिसके द्वारा एक संबंधपरक डेटाबेस के लिए प्रश्न पूछे जाते हैं। जॉइन एक जटिल अवधारणा पर नहीं हैं और यदि आपको समस्याएं आ रही हैं तो मेरा सुझाव है कि आप संबंधपरक डेटाबेस पर अतिरिक्त शुरुआत करना शुरू करें। यदि आप वास्तव में कॉर्क विश्वविद्यालय में छात्र हैं तो आपको इस संसाधन तक पहुंचने में सक्षम होना चाहिए: http://proquest.safaribooksonline.com/?xmlId=1-56592-744-3&uiCode=CORK –

उत्तर

67

जॉइन का उपयोग दो संबंधित तालिकाओं को एक साथ जोड़ने के लिए किया जाता है।

अपने उदाहरण में, आप तो जैसे कर्मचारी मेज और विभाग की मेज, गठजोड़ कर सकते हैं:

FNAME LNAME DNAME 
----- ----- ----- 
John Smith Research 
John Doe  Administration 

मैं ऊपर एक INNER JOIN प्रयोग किया है:

SELECT FNAME, LNAME, DNAME 
FROM 
EMPLOYEE INNER JOIN DEPARTMENT ON EMPLOYEE.DNO=DEPARTMENT.DNUMBER 

इस तरह एक recordset में परिणाम होगा। INNER JOIN एस दो तालिकाओं को गठबंधन करता है ताकि केवल दोनों तालिकाओं में मैचों के साथ रिकॉर्ड प्रदर्शित किए गए हों, और इस मामले में में शामिल हुए, विभाग संख्या (कर्मचारी तालिका में डीएनओ, विभाग तालिका में डीएनजी) पर।

LEFT JOIN आपको पहली तालिका में रिकॉर्ड होने पर दो तालिकाओं को गठबंधन करने की अनुमति देता है लेकिन में दूसरी तालिका में रिकॉर्ड नहीं हो सकते हैं। उदाहरण के लिए, मान लीजिए कि आप सभी कर्मचारियों की एक सूची चाहते हैं, के साथ साथ किसी भी आश्रितों:

SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_last, DEPENDENT.LNAME as dependent_last 
FROM 
EMPLOYEE INNER JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN 

समस्या है कि यहाँ एक आश्रित है, तो उनके रिकॉर्ड नहीं दिखाई देगा अगर एक कर्मचारी नहीं है बिलकुल नहीं - क्योंकि डिमेंडर टेबल में कोई मिलान रिकॉर्ड नहीं है।

SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_first, DEPENDENT.LNAME as dependent_last 
FROM 
EMPLOYEE LEFT JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN 
:

तो, आप एक छोड़ दिया में शामिल होने के जो "छोड़" (यानी पहली तालिका) पर सभी डेटा रखता है और "सही" पर किसी भी मिलान डेटा में खींचती है (दूसरी तालिका) का उपयोग

अब हम कर्मचारी रिकॉर्ड के सभी प्राप्त करते हैं। यदि किसी दिए गए कर्मचारी के लिए कोई मिलान निर्भर नहीं है, तो dependent_first और dependent_last फ़ील्ड शून्य हो जाएंगे।

+3

+1 पूरी तरह उत्तर के लिए! – Diego

+0

हाँ, मुझे एहसास हुआ कि जैसे ही मैंने अपना जवाब पूरा कर लिया था कि यह मूल रूप से होमवर्क असाइनमेंट था (मैंने नीचे दिए गए प्रश्नों को अनदेखा किया और केवल पहले भाग और लिंक किए गए दस्तावेज़ पर ध्यान केंद्रित किया)। मैंने वाक्य "होमवर्क के रूप में टैग की गईं" को जोड़ा लेकिन फिर देखा कि किसी और ने मुझे पंच पर मार दिया था इसलिए मैंने उस रेखा को हटा दिया। :) –

+0

यह होमवर्क नहीं है। उत्तर के लिए बहुत बहुत धन्यवाद, बहुत उपयोगी :)। –

2

जब आप सभी की आवश्यकता वाले तालिकाओं में से किसी एक के परिणाम के बाहरी बहिष्कार का उपयोग करते हैं, चाहे अन्य तालिका में मिलान पंक्ति हो या नहीं।

+4

पूरी तरह से यहां समझाया गया: [http : //stackoverflow.com/questions/38549/sql-difference-between-inner-and-outer-join] (http://stackoverflow.com/questions/38549/sql-difference-between-inner-and-outer- शामिल हों) –

23

उदाहरण (अपने उदाहरण तालिकाओं का उपयोग नहीं :-)

मैं एक कार किराए पर लेने की कंपनी है।

Table car 
id: integer primary key autoincrement 
licence_plate: varchar 
purchase_date: date 

Table customer 
id: integer primary key autoincrement 
name: varchar 

Table rental 
id: integer primary key autoincrement 
car_id: integer 
bike_id: integer 
customer_id: integer 
rental_date: date 

सरल अधिकार? मेरे पास कारों के लिए 10 रिकॉर्ड हैं क्योंकि मेरे पास 10 कार हैं।
मैं इस व्यवसाय को 10 वर्षों से चला रहा हूं, इसलिए मेरे पास 1000 ग्राहक हैं।
और मैं प्रति कार 20x प्रति वर्ष कारों को किराए पर लेता हूं = 10 साल x 10 कार x 20 = 2000 किराया।

यदि मैं सब कुछ एक बड़ी तालिका में स्टोर करता हूं तो मुझे 10x1000x2000 = 20 मिलियन रिकॉर्ड मिलते हैं।
यदि मैं इसे 3 टेबल में संग्रहीत करता हूं तो मुझे 10 + 1000 + 2000 = 3010 रिकॉर्ड मिल गए हैं।
यह परिमाण के 3 आदेश है, इसलिए मैं 3 टेबल का उपयोग करता हूं।

लेकिन क्योंकि मैं 3 टेबल का उपयोग मैं का उपयोग करने के क्रम में बाहर फिर से
(कम से कम अगर मैं नाम और नंबर के बजाय लाइसेंस प्लेट चाहते हैं) डेटा प्राप्त करने में मिलती है (स्थान और समय बचाने के लिए) ।

का उपयोग आंतरिक

ग्राहक 345 के लिए सभी किराया मिलती है?

SELECT * FROM customer 
INNER JOIN rental on (rental.customer_id = customer.id) 
INNER JOIN car on (car.id = rental.car_id) 
WHERE customer.id = 345. 

कि एक INNER JOIN है, क्योंकि हम केवल कारों linked to किराया linked to है कि ग्राहकों को वास्तव में क्या हुआ के बारे में जानना चाहते हैं

ध्यान दें कि हमारे पास बाइक टेबल से जुड़ा हुआ बाइक_आईड भी है, जो कार टेबल के समान ही अलग है। कैसे हम ग्राहक 345
के लिए सभी बाइक + कार किराया मिलेगा हम कोशिश करते हैं और इस

SELECT * FROM customer 
INNER JOIN rental on (rental.customer_id = customer.id) 
INNER JOIN car on (car.id = rental.car_id) 
INNER JOIN bike on (bike.id = rental.bike_id) 
WHERE customer.id = 345. 

करते लेकिन वह एक खाली सेट दे देंगे कर सकते हैं !!
ऐसा इसलिए है क्योंकि किराए पर या तो बाइक_rentल या एक कार_rental हो सकता है, लेकिन दोनों एक ही समय में नहीं।
और गैर-कामकाजी inner join क्वेरी केवल उन सभी किरायों के परिणाम देगा जहां हम एक ही लेनदेन में बाइक और एक कार दोनों किराए पर लेते हैं।
हम एक बूलियन AND शामिल होने का उपयोग करके OR संबंध प्राप्त करने और बुलियन करने की कोशिश कर रहे हैं।

बाहरी का उपयोग

मिलती है इस को हल करने के लिए हम एक outer join जरूरत है आदेश में।

की इसके साथ यह कम से left join

SELECT * FROM customer 
INNER JOIN rental on (rental.customer_id = customer.id) <<-- link always 
LEFT JOIN car on (car.id = rental.car_id) <<-- link half of the time 
LEFT JOIN bike on (bike.id = rental.bike_id) <<-- link (other) 0.5 of the time. 
WHERE customer.id = 345. 

देखो इस तरह से हल करते हैं।एक inner join एक AND है और एक left join निम्नलिखित स्यूडोकोड में के रूप में एक OR है:

if a=1 AND a=2 then {this is always false, no result} 
if a=1 OR a=2 then {this might be true or not} 

आप टेबल बना सकते हैं और क्वेरी आप परिणाम देख सकते हैं चलाते हैं।

शब्दावली

एक left join पर एक left outer join के समान है। ए join कोई अतिरिक्त उपसर्ग नहीं है inner join full outer join भी है। प्रोग्रामिंग के 25 वर्षों में मैंने कभी इसका इस्तेमाल नहीं किया है।

क्यों वाम

वैसे वहाँ दो शामिल टेबल है में शामिल हो। उदाहरण में हम एक inner join के साथ जुड़ा हुआ किराए पर लेने के लिए
ग्राहक, एक आंतरिक दोनों तालिकाओं चाहिए लिंक तो वहाँ left:customer मेज और right:rental तालिका के बीच कोई अंतर नहीं है में शामिल होने में।

अगला लिंक left joinleft:rental और right:car के बीच था। बाईं तरफ सभी पंक्तियों को लिंक करना चाहिए और दाईं तरफ उन्हें सही नहीं करना चाहिए। यही कारण है कि यह left join

+0

जैसे स्पष्टीकरण के लिए – hqt

0

मुझे लगता है कि प्रश्न 3 (बी) भ्रमित है क्योंकि इसका संपूर्ण आधार गलत है: आपको "क्वेरी को हल करने" के लिए बाहरी शामिल होने की आवश्यकता नहीं है। पर विचार इस (परीक्षा पत्र में वाक्य रचना की शैली का अनुसरण शायद बुद्धिमान है):

SELECT FNAME, LNAME, DEPENDENT_NAME 
    FROM EMPLOYEE, DEPENDENT 
WHERE SSN = ESSN 
     AND RELATIONSHIP = 'SPOUSE' 
UNION 
SELECT FNAME, LNAME, NULL 
    FROM EMPLOYEE 
EXCEPT 
SELECT FNAME, LNAME, DEPENDENT_NAME 
    FROM EMPLOYEE, DEPENDENT 
WHERE SSN = ESSN 
     AND RELATIONSHIP = 'SPOUSE' 
0

सामान्य में: एक साथ शामिल हों जोड़ों दो तालिकाओं। जब आप "लुक अप" करना चाहते हैं, तो किसी भी विशिष्ट कॉलम की विस्तृत जानकारी देखने के लिए इनर जॉइन का उपयोग करें। जब आप "प्रदर्शन" करना चाहते हैं, तो बाहरी जॉइन का उपयोग करें, जैसे कि 2 टेबल की सभी जानकारी सूचीबद्ध करें।

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