खोज…


परिचय

JOIN दो तालिकाओं से सूचनाओं को मिलाने (मिलाने) का एक तरीका है। परिणाम दोनों तालिकाओं से स्तंभों का एक सिला हुआ सेट है, जो सम्मिलित प्रकार (INNER / OUTER / CROSS और LEFT / RULL / FULL, नीचे समझाया गया है) द्वारा परिभाषित किया गया है और मानदंड (दोनों तालिकाओं से कैसे पंक्तियाँ संबंधित हैं) शामिल हैं।

एक तालिका स्वयं या किसी अन्य तालिका में शामिल हो सकती है। यदि दो से अधिक तालिकाओं की जानकारी तक पहुँचने की आवश्यकता होती है, तो FROM क्लॉज में कई जोड़ निर्दिष्ट किए जा सकते हैं।

वाक्य - विन्यास

  • [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } ] JOIN

टिप्पणियों

जोड़ियां, जैसा कि उनके नाम से पता चलता है, एक संयुक्त फैशन में कई तालिकाओं के डेटा को क्वेरी करने का एक तरीका है, जिसमें पंक्तियाँ एक से अधिक तालिका से लिए गए स्तंभों को प्रदर्शित करती हैं।

बुनियादी स्पष्ट आंतरिक सम्मिलित हों

एक बुनियादी (भी "आंतरिक में शामिल होने के" कहा जाता है) में शामिल होने के लिए दो तालिकाओं के डेटा से क्वेरी करता, उनके रिश्ते के साथ एक में परिभाषित join खंड।

निम्नलिखित उदाहरण कर्मचारियों की तालिका से कर्मचारियों के पहले नाम (FName) और विभाग तालिका से (नाम) के लिए काम करने वाले विभाग का नाम चुनेंगे:

SELECT Employees.FName, Departments.Name
FROM   Employees
JOIN   Departments
ON Employees.DepartmentId = Departments.Id

यह उदाहरण डेटाबेस से निम्नलिखित लौटाएगा:

Employees.FName Departments.Name
जेम्स मानव संसाधन
जॉन मानव संसाधन
रिचर्ड बिक्री

सम्मिलित हों

जॉइंट्स को क्लॉज from कई टेबल में रखकर भी प्रदर्शन किया जा सकता है, कॉमा के साथ अलग किया जा सकता है , और where क्लॉज में उन दोनों के बीच संबंध को परिभाषित किया जा सकता है। इस तकनीक को इंप्लांट जॉइन कहा जाता है (क्योंकि इसमें वास्तव में join क्लॉज नहीं होता है)।

सभी RDBMS इसका समर्थन करते हैं, लेकिन आमतौर पर वाक्य रचना के खिलाफ सलाह दी जाती है। इस सिंटैक्स का उपयोग करने के लिए यह एक बुरा विचार है कारण:

  • आकस्मिक क्रॉस जॉइन प्राप्त करना संभव है जो फिर गलत परिणाम लौटाता है, खासकर यदि आपके पास क्वेरी में बहुत सारे जोड़ हैं।
  • यदि आपने एक क्रॉस जॉइन का इरादा किया है, तो यह सिंटैक्स से स्पष्ट नहीं है (इसके बजाय CROSS JOIN लिखें), और किसी को रखरखाव के दौरान इसे बदलने की संभावना है।

निम्नलिखित उदाहरण कर्मचारी के पहले नामों और उन विभागों के नाम का चयन करेंगे जिनके लिए वे काम करते हैं:

SELECT e.FName, d.Name
FROM   Employee e, Departments d
WHERE  e.DeptartmentId = d.Id

यह उदाहरण डेटाबेस से निम्नलिखित लौटाएगा:

e.FName d.Name
जेम्स मानव संसाधन
जॉन मानव संसाधन
रिचर्ड बिक्री

बाईं ओर का बाहरी जोड़

एक लेफ्ट आउटर जॉइन (जिसे लेफ्ट जॉइन या आउटर जॉइन के नाम से भी जाना जाता है) एक जॉइन है जो यह सुनिश्चित करता है कि लेफ्ट टेबल से सभी पंक्तियों का प्रतिनिधित्व किया जाता है; यदि सही तालिका से कोई मिलान पंक्ति मौजूद नहीं है, तो इसके संबंधित क्षेत्र NULL

निम्नलिखित उदाहरण सभी विभागों और उस विभाग में काम करने वाले कर्मचारियों के पहले नाम का चयन करेंगे। परिणाम में कोई कर्मचारी नहीं है, लेकिन अभी भी कर्मचारी के नाम के लिए NULL नहीं है:

SELECT          Departments.Name, Employees.FName
FROM            Departments 
LEFT OUTER JOIN Employees 
ON              Departments.Id = Employees.DepartmentId

यह उदाहरण डेटाबेस से निम्नलिखित लौटाएगा:

Departments.Name Employees.FName
मानव संसाधन जेम्स
मानव संसाधन जॉन
मानव संसाधन Johnathon
बिक्री माइकल
टेक शून्य

यह कैसे काम करता है?

FROM क्लॉज में दो टेबल हैं:

ईद fName LName फ़ोन नंबर प्रबंधक- DepartmentId वेतन चुनने की तारीख
1 जेम्स लोहार 1 2 3 4 5 6 7 8 9 0 शून्य 1 1000 2002/01/01
2 जॉन जॉनसन 2468101214 1 1 400 23-03-2005
3 माइकल विलियम्स 1357911131 1 2 600 2009/12/05
4 Johnathon लोहार 1212121212 2 1 500 24-07-2016

तथा

ईद नाम
1 मानव संसाधन
2 बिक्री
3 टेक

पहले एक कार्टेशियन उत्पाद को दो टेबल से बनाया जाता है जो एक मध्यवर्ती तालिका देता है।
ज्वाइन मानदंड ( विभागों ) ।d = Employees.DepboxId ) को पूरा करने वाले रिकॉर्ड बोल्ड में हाइलाइट किए गए हैं; इन्हें क्वेरी के अगले चरण में पास किया जाता है।

जैसा कि यह एक LEFT OUTER JOIN है, सभी रिकॉर्ड ज्वाइन (विभागों) के LEFT साइड से दिए जाते हैं, जबकि RIGHT साइड के किसी भी रिकॉर्ड को NULL मार्कर दिया जाता है यदि वे जॉइन मापदंड से मेल नहीं खाते हैं। नीचे दी गई तालिका में NULL साथ Tech वापस आ जाएगी

ईद नाम ईद fName LName फ़ोन नंबर प्रबंधक- DepartmentId वेतन चुनने की तारीख
1 मानव संसाधन 1 जेम्स लोहार 1 2 3 4 5 6 7 8 9 0 शून्य 1 1000 2002/01/01
1 मानव संसाधन 2 जॉन जॉनसन 2468101214 1 1 400 23-03-2005
1 मानव संसाधन 3 माइकल विलियम्स 1357911131 1 2 600 2009/12/05
1 मानव संसाधन 4 Johnathon लोहार 1212121212 2 1 500 24-07-2016
2 बिक्री 1 जेम्स लोहार 1 2 3 4 5 6 7 8 9 0 शून्य 1 1000 2002/01/01
2 बिक्री 2 जॉन जॉनसन 2468101214 1 1 400 23-03-2005
2 बिक्री 3 माइकल विलियम्स 1357911131 1 2 600 2009/12/05
2 बिक्री 4 Johnathon लोहार 1212121212 2 1 500 24-07-2016
3 टेक 1 जेम्स लोहार 1 2 3 4 5 6 7 8 9 0 शून्य 1 1000 2002/01/01
3 टेक 2 जॉन जॉनसन 2468101214 1 1 400 23-03-2005
3 टेक 3 माइकल विलियम्स 1357911131 1 2 600 2009/12/05
3 टेक 4 Johnathon लोहार 1212121212 2 1 500 24-07-2016

अंत में सेलेक्ट क्लॉज के भीतर इस्तेमाल होने वाले प्रत्येक एक्सप्रेशन का मूल्यांकन हमारी अंतिम तालिका को लौटाने के लिए किया जाता है:

Departments.Name Employees.FName
मानव संसाधन जेम्स
मानव संसाधन जॉन
बिक्री रिचर्ड
टेक शून्य

स्वयं सम्मिलित हों

एक तालिका खुद से जुड़ सकती है, जिसमें अलग-अलग पंक्तियाँ एक-दूसरे से किसी न किसी स्थिति से मेल खाती हैं। इस उपयोग के मामले में, टेबल की दो घटनाओं को अलग करने के लिए उपनाम का उपयोग किया जाना चाहिए।

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

SELECT 
    e.FName AS "Employee", 
    m.FName AS "Manager"
FROM   
    Employees e
JOIN   
    Employees m 
    ON e.ManagerId = m.Id

यह क्वेरी निम्नलिखित डेटा लौटाएगी:

कर्मचारी मैनेजर
जॉन जेम्स
माइकल जेम्स
Johnathon जॉन

यह कैसे काम करता है?

मूल तालिका में ये रिकॉर्ड हैं:

ईद fName LName फ़ोन नंबर प्रबंधक- DepartmentId वेतन चुनने की तारीख
1 जेम्स लोहार 1 2 3 4 5 6 7 8 9 0 शून्य 1 1000 2002/01/01
2 जॉन जॉनसन 2468101214 1 1 400 23-03-2005
3 माइकल विलियम्स 1357911131 1 2 600 2009/12/05
4 Johnathon लोहार 1212121212 2 1 500 24-07-2016

पहली क्रिया FROM क्लॉज में प्रयुक्त तालिकाओं में सभी अभिलेखों का कार्टेशियन उत्पाद बनाना है। इस मामले में यह दो बार कर्मचारी तालिका है, इसलिए मध्यवर्ती तालिका इस तरह दिखाई देगी (मैंने इस उदाहरण में उपयोग नहीं किए गए किसी भी फ़ील्ड को हटा दिया है):

e.Id e.FName e.ManagerId m.Id m.FName m.ManagerId
1 जेम्स शून्य 1 जेम्स शून्य
1 जेम्स शून्य 2 जॉन 1
1 जेम्स शून्य 3 माइकल 1
1 जेम्स शून्य 4 Johnathon 2
2 जॉन 1 1 जेम्स शून्य
2 जॉन 1 2 जॉन 1
2 जॉन 1 3 माइकल 1
2 जॉन 1 4 Johnathon 2
3 माइकल 1 1 जेम्स शून्य
3 माइकल 1 2 जॉन 1
3 माइकल 1 3 माइकल 1
3 माइकल 1 4 Johnathon 2
4 Johnathon 2 1 जेम्स शून्य
4 Johnathon 2 2 जॉन 1
4 Johnathon 2 3 माइकल 1
4 Johnathon 2 4 Johnathon 2

अगली कार्रवाई को ही रिकार्ड को पूरा मापदंड शामिल हों रखने के लिए, किसी भी रिकॉर्ड जहां aliased इतना है e तालिका ManagerId aliased के बराबर होती है m तालिका Id :

e.Id e.FName e.ManagerId m.Id m.FName m.ManagerId
2 जॉन 1 1 जेम्स शून्य
3 माइकल 1 1 जेम्स शून्य
4 Johnathon 2 2 जॉन 1

फिर, SELECT क्लॉज़ के भीतर उपयोग की जाने वाली प्रत्येक अभिव्यक्ति का मूल्यांकन इस तालिका को लौटाने के लिए किया जाता है:

e.FName m.FName
जॉन जेम्स
माइकल जेम्स
Johnathon जॉन

अंत में, स्तंभ के नाम e.FName और m.FName को उनके उपनाम स्तंभ नामों से बदल दिया जाता है, जिन्हें AS ऑपरेटर द्वारा सौंपा गया है:

कर्मचारी मैनेजर
जॉन जेम्स
माइकल जेम्स
Johnathon जॉन

क्रोस जॉइन

क्रॉस ज्वाइन दो सदस्यों के कार्टेशियन उत्पाद करता है, ए कार्टेशियन उत्पाद का मतलब है कि एक तालिका की प्रत्येक पंक्ति में दूसरी तालिका की प्रत्येक पंक्ति के साथ संयुक्त है। उदाहरण के लिए, यदि TABLEA में 20 पंक्तियाँ हैं और TABLEB में 20 पंक्तियाँ हैं, तो परिणाम 20*20 = 400 आउटपुट पंक्तियाँ होंगी।

उदाहरण डेटाबेस का उपयोग करना

SELECT d.Name, e.FName
FROM   Departments d
CROSS JOIN Employees e;

कौन सा रिटर्न:

d.Name e.FName
मानव संसाधन जेम्स
मानव संसाधन जॉन
मानव संसाधन माइकल
मानव संसाधन Johnathon
बिक्री जेम्स
बिक्री जॉन
बिक्री माइकल
बिक्री Johnathon
टेक जेम्स
टेक जॉन
टेक माइकल
टेक Johnathon

यदि आप एक कार्टेसियन जॉइन करना चाहते हैं, तो यह स्पष्ट करने के लिए कि आप क्या चाहते हैं, एक स्पष्ट क्रॉस लिखने की सिफारिश की जाती है।

एक उपकेंद्र पर शामिल हो रहे हैं

जब आप बच्चे / विवरण तालिका से कुल डेटा प्राप्त करना चाहते हैं और अभिभावक / हेडर टेबल से रिकॉर्ड के साथ प्रदर्शित करना चाहते हैं, तो एक सबक्वेरी में शामिल होने का उपयोग अक्सर किया जाता है। उदाहरण के लिए, आप चाइल्ड रिकॉर्ड्स, चाइल्ड रिकॉर्ड्स में औसतन कुछ न्यूमेरिक कॉलम या डेट या न्यूमेरिक फील्ड के आधार पर टॉप या बॉटम रो की गिनती प्राप्त कर सकते हैं। यह उदाहरण उपनामों का उपयोग करता है, जो तर्कपूर्ण प्रश्न को पढ़ने में आसान बनाता है जब आपके पास कई टेबल शामिल होते हैं। यहाँ एक काफी विशिष्ट उपश्रेणी शामिल है जो दिखता है। इस मामले में हम मूल तालिका खरीद आदेशों से सभी पंक्तियों को पुनर्प्राप्त कर रहे हैं और बाल तालिका PurchaseOrderLineItems के प्रत्येक मूल रिकॉर्ड के लिए केवल पहली पंक्ति प्राप्त कर रहे हैं।

SELECT po.Id, po.PODate, po.VendorName, po.Status, item.ItemNo, 
  item.Description, item.Cost, item.Price
FROM PurchaseOrders po
LEFT JOIN 
     (
       SELECT l.PurchaseOrderId, l.ItemNo, l.Description, l.Cost, l.Price, Min(l.id) as Id 
       FROM PurchaseOrderLineItems l
       GROUP BY l.PurchaseOrderId, l.ItemNo, l.Description, l.Cost, l.Price
     ) AS item ON item.PurchaseOrderId = po.Id

पार का आवेदन और स्थानीय जॉय

JOIN का एक बहुत ही रोचक प्रकार है LATERAL JOIN (PostgreSQL 9.3+ में नया)
जिसे SQL-Server और Oracle में CROSS APPLY / OUTER APPLY के रूप में भी जाना जाता है।

मूल विचार यह है कि आपके द्वारा जुड़ने वाली प्रत्येक पंक्ति के लिए एक टेबल-वैल्यू फ़ंक्शन (या इनलाइन सबक्वेरी) लागू किया जाता है।

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

वाक्य - विन्यास:

PostgreSQL 9.3+

छोड़ दिया | सही | आंतरिक जॉय लोकल

एस क्यू एल सर्वर:

CROSS | OUTER APPLY

INNER JOIN LATERAL , CROSS APPLY के समान है
और LEFT JOIN LATERAL , OUTER APPLY के समान है

उदाहरण का उपयोग (PostgreSQL 9.3+):

SELECT * FROM T_Contacts 

--LEFT JOIN T_MAP_Contacts_Ref_OrganisationalUnit ON MAP_CTCOU_CT_UID = T_Contacts.CT_UID AND MAP_CTCOU_SoftDeleteStatus = 1 
--WHERE T_MAP_Contacts_Ref_OrganisationalUnit.MAP_CTCOU_UID IS NULL -- 989


LEFT JOIN LATERAL 
(
    SELECT 
         --MAP_CTCOU_UID    
         MAP_CTCOU_CT_UID   
        ,MAP_CTCOU_COU_UID  
        ,MAP_CTCOU_DateFrom 
        ,MAP_CTCOU_DateTo   
   FROM T_MAP_Contacts_Ref_OrganisationalUnit 
   WHERE MAP_CTCOU_SoftDeleteStatus = 1 
   AND MAP_CTCOU_CT_UID = T_Contacts.CT_UID 

    /*  
    AND 
    ( 
        (__in_DateFrom <= T_MAP_Contacts_Ref_OrganisationalUnit.MAP_KTKOE_DateTo) 
        AND 
        (__in_DateTo >= T_MAP_Contacts_Ref_OrganisationalUnit.MAP_KTKOE_DateFrom) 
    ) 
    */
   ORDER BY MAP_CTCOU_DateFrom 
   LIMIT 1 
) AS FirstOE 

और SQL- सर्वर के लिए

SELECT * FROM T_Contacts 

--LEFT JOIN T_MAP_Contacts_Ref_OrganisationalUnit ON MAP_CTCOU_CT_UID = T_Contacts.CT_UID AND MAP_CTCOU_SoftDeleteStatus = 1 
--WHERE T_MAP_Contacts_Ref_OrganisationalUnit.MAP_CTCOU_UID IS NULL -- 989

-- CROSS APPLY -- = INNER JOIN 
OUTER APPLY    -- = LEFT JOIN 
(
    SELECT TOP 1 
         --MAP_CTCOU_UID    
         MAP_CTCOU_CT_UID   
        ,MAP_CTCOU_COU_UID  
        ,MAP_CTCOU_DateFrom 
        ,MAP_CTCOU_DateTo   
   FROM T_MAP_Contacts_Ref_OrganisationalUnit 
   WHERE MAP_CTCOU_SoftDeleteStatus = 1 
   AND MAP_CTCOU_CT_UID = T_Contacts.CT_UID 

    /*  
    AND 
    ( 
        (@in_DateFrom <= T_MAP_Contacts_Ref_OrganisationalUnit.MAP_KTKOE_DateTo) 
        AND 
        (@in_DateTo >= T_MAP_Contacts_Ref_OrganisationalUnit.MAP_KTKOE_DateFrom) 
    ) 
    */
   ORDER BY MAP_CTCOU_DateFrom 
) AS FirstOE 

पूरा जोइन

JOIN का एक प्रकार जिसे कम जाना जाता है, वह पूर्ण JOIN है।
(नोट: फुल जॉइन 2016 के अनुसार MySQL द्वारा समर्थित नहीं है)

एक पूर्ण OUT JOIN, बाईं तालिका से सभी पंक्तियों को और दाएं तालिका से सभी पंक्तियों को वापस करता है।

यदि बाईं तालिका में ऐसी पंक्तियाँ हैं, जिनमें दाईं तालिका में मिलान नहीं हैं, या यदि दाईं तालिका में ऐसी पंक्तियाँ हैं, जिनकी बाईं तालिका में मिलान नहीं हैं, तो उन पंक्तियों को भी सूचीबद्ध किया जाएगा।

उदाहरण 1 :

SELECT * FROM Table1

FULL JOIN Table2 
     ON 1 = 2 

उदाहरण 2:

SELECT 
     COALESCE(T_Budget.Year, tYear.Year) AS RPT_BudgetInYear 
    ,COALESCE(T_Budget.Value, 0.0) AS RPT_Value 
FROM T_Budget 

FULL JOIN tfu_RPT_All_CreateYearInterval(@budget_year_from, @budget_year_to) AS tYear 
      ON tYear.Year = T_Budget.Year 

ध्यान दें कि यदि आप सॉफ्ट-डिलीट का उपयोग कर रहे हैं, तो आपको WHERE- क्लॉज में सॉफ्ट-डिलीट स्टेटस को फिर से जांचना होगा (क्योंकि फुल जॉइन एक यूनिअन की तरह ही व्यवहार करता है);
इस छोटे से तथ्य को अनदेखा करना आसान है, क्योंकि आप AP_SoftDeleteStatus = 1 को क्लॉज में शामिल करते हैं।

इसके अलावा, अगर आप फुल जॉइन कर रहे हैं, तो आपको आमतौर पर NULL को WHERE-क्लॉज में अनुमति देनी होगी; एक मूल्य पर NULL की अनुमति देना भूल जाने से INNER जॉइन के समान ही प्रभाव पड़ेगा, जो कि आप चाहते हैं कि अगर आप FULL JOIN कर रहे हैं तो कुछ ऐसा न हो।

उदाहरण:

SELECT 
     T_AccountPlan.AP_UID
    ,T_AccountPlan.AP_Code
    ,T_AccountPlan.AP_Lang_EN
    ,T_BudgetPositions.BUP_Budget
    ,T_BudgetPositions.BUP_UID 
    ,T_BudgetPositions.BUP_Jahr
FROM T_BudgetPositions    

FULL JOIN T_AccountPlan
    ON T_AccountPlan.AP_UID = T_BudgetPositions.BUP_AP_UID 
    AND T_AccountPlan.AP_SoftDeleteStatus = 1 

WHERE (1=1) 
AND (T_BudgetPositions.BUP_SoftDeleteStatus = 1 OR T_BudgetPositions.BUP_SoftDeleteStatus IS NULL) 
AND (T_AccountPlan.AP_SoftDeleteStatus = 1 OR T_AccountPlan.AP_SoftDeleteStatus IS NULL) 

रिकर्सिव जॉयस

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

WITH RECURSIVE MyDescendants AS (
    SELECT Name
    FROM People
    WHERE Name = 'John Doe'

    UNION ALL

    SELECT People.Name
    FROM People
    JOIN MyDescendants ON People.Name = MyDescendants.Parent
)
SELECT * FROM MyDescendants;

आंतरिक / बाहरी जुड़नों के बीच अंतर

SQL में विभिन्न जुड़ने के प्रकार होते हैं, जो यह बताते हैं कि (गैर-) मिलान पंक्तियों को परिणाम में शामिल किया गया है: INNER JOIN , LEFT OUTER JOIN , RIGHT OUTER JOIN और FULL OUTER JOIN ( INNER और OUTER कीवर्ड वैकल्पिक हैं)। नीचे दिया गया आंकड़ा इन प्रकारों के बीच के अंतर को रेखांकित करता है: नीला क्षेत्र जुड़ने से वापस आए परिणामों का प्रतिनिधित्व करता है, और सफेद क्षेत्र उन परिणामों का प्रतिनिधित्व करता है जो जुड़ने पर वापस नहीं आएंगे।

Venn आरेख SQL आंतरिक / बाहरी जॉइन का प्रतिनिधित्व करते हैं

क्रॉस SQL चित्र प्रस्तुति ( संदर्भ ) में शामिल हों:

यहाँ छवि विवरण दर्ज करें

नीचे इस उत्तर से उदाहरण दिए गए हैं।

उदाहरण के लिए नीचे दो तालिकाएँ हैं:

A    B
-    -
1    3
2    4
3    5
4    6

ध्यान दें कि (1,2) A के लिए अद्वितीय हैं, (3,4) सामान्य हैं, और (5,6) B के लिए अद्वितीय हैं।

आंतरिक रूप से जुड़ा

दोनों में से किसी एक समतुल्य प्रश्नों का उपयोग करके एक आंतरिक जुड़ाव दो तालिकाओं के प्रतिच्छेदन को देता है, अर्थात दो पंक्तियाँ जो उनके पास हैं:

select * from a INNER JOIN b on a.a = b.b;
select a.*,b.* from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

बाईं ओर का बाहरी जोड़

एक बाईं बाहरी जुड़ाव A में सभी पंक्तियाँ देगा, साथ ही B में कोई भी सामान्य पंक्तियाँ:

select * from a LEFT OUTER JOIN b on a.a = b.b;

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

सही बाहरी जुड़ना

इसी तरह, एक सही बाहरी जुड़ाव B में सभी पंक्तियों को जोड़ देगा, साथ ही A में कोई भी सामान्य पंक्तियाँ:

select * from a RIGHT OUTER JOIN b on a.a = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

पूर्ण बाहरी जुड़ना

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

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5

जोइन शब्दावली: इनर, आउटर, सेमी, एंटी ...

मान लें कि हमारे पास दो टेबल (A और B) हैं और उनकी कुछ पंक्तियाँ मेल खाती हैं (दिए गए JOIN स्थिति के सापेक्ष, जो कुछ विशेष स्थिति में हो सकती है):

शब्दावली अवलोकन में शामिल हों

हम दोनों में से मेल खाते हुए या गैर-मेलिंग पंक्तियों को शामिल करने या बाहर करने के लिए विभिन्न सम्मिलित प्रकारों का उपयोग कर सकते हैं, और ऊपर दिए गए आरेख से संबंधित शब्दों को उठाकर सही ढंग से जुड़ने का नाम दे सकते हैं।

नीचे दिए गए उदाहरण निम्नलिखित परीक्षण डेटा का उपयोग करते हैं:

CREATE TABLE A (
    X varchar(255) PRIMARY KEY
);

CREATE TABLE B (
    Y varchar(255) PRIMARY KEY
);

INSERT INTO A VALUES
    ('Amy'),
    ('John'),
    ('Lisa'),
    ('Marco'),
    ('Phil');

INSERT INTO B VALUES
    ('Lisa'),
    ('Marco'),
    ('Phil'),
    ('Tim'),
    ('Vincent');

आंतरिक रूप से जुड़ा

मैच से बायीं और दायीं पंक्तियों को मिलाता है।

आंतरिक रूप से जुड़ा

SELECT * FROM A JOIN B ON X = Y;

X      Y
------ -----
Lisa   Lisa
Marco  Marco
Phil   Phil

बाईं ओर का बाहरी जोड़

कभी-कभी "लेफ्ट जॉइन" के लिए संक्षिप्त। उस मेल से बायीं और दायीं पंक्तियों को मिलाता है, और गैर-मिलान वाली बायीं पंक्तियों को शामिल करता है।

बाईं ओर का बाहरी जोड़

SELECT * FROM A LEFT JOIN B ON X = Y;

X      Y
-----  -----
Amy    NULL
John   NULL
Lisa   Lisa
Marco  Marco
Phil   Phil

राइट आउटर जॉइन करें

कभी-कभी "सही जुड़ने" के लिए संक्षिप्त। उस मेल से बायीं और दायीं पंक्तियों को जोड़ती है, और गैर-मिलान वाली दाईं पंक्तियों को शामिल करती है।

राइट आउटर जॉइन

SELECT * FROM A RIGHT JOIN B ON X = Y;

X      Y
-----  -------
Lisa   Lisa
Marco  Marco
Phil   Phil
NULL   Tim
NULL   Vincent

पूर्ण बाहरी सम्मिलित हों

कभी-कभी "पूर्ण जुड़ाव" के लिए संक्षिप्त। बाएँ और दाएँ बाहरी मिलन।

पूर्ण बाहरी सम्मिलित हों

SELECT * FROM A FULL JOIN B ON X = Y;

X      Y
-----  -------
Amy    NULL
John   NULL
Lisa   Lisa
Marco  Marco
Phil   Phil
NULL   Tim
NULL   Vincent

लेफ्ट सेमी जॉइन करें

दाएं पंक्तियों से मेल खाने वाली बाईं पंक्तियां शामिल हैं।

लेफ्ट सेमी जॉइन करें

SELECT * FROM A WHERE X IN (SELECT Y FROM B);

X
-----
Lisa
Marco
Phil

राइट सेमी जॉइन

दाएं पंक्तियां शामिल हैं जो बाईं पंक्तियों से मेल खाती हैं।

राइट सेमी जॉइन

SELECT * FROM B WHERE Y IN (SELECT X FROM A);

Y
-----
Lisa
Marco
Phil

जैसा कि आप देख सकते हैं, लेफ्ट बनाम राइट सेमी जॉइन के लिए कोई समर्पित इन सिंटैक्स नहीं है - हम एसक्यूएल टेक्स्ट के भीतर केवल टेबल पोजीशन को स्विच करके प्रभाव को प्राप्त करते हैं।


वाम विरोधी अर्ध शामिल हों

बाईं पंक्तियाँ शामिल हैं जो सही पंक्तियों से मेल नहीं खाती हैं।

वाम विरोधी अर्ध शामिल हों

SELECT * FROM A WHERE X NOT IN (SELECT Y FROM B);

X
----
Amy
John

चेतावनी: यदि आप एक सक्षम स्तंभ पर नहीं का उपयोग कर होने के लिए सावधान रहें! अधिक जानकारी यहाँ


राइट एंटी सेमी जॉइन

सही पंक्तियाँ शामिल हैं जो बाईं पंक्तियों से मेल नहीं खाती हैं।

राइट एंटी सेमी जॉइन

SELECT * FROM B WHERE Y NOT IN (SELECT X FROM A);

Y
-------
Tim
Vincent

जैसा कि आप देख सकते हैं, लेफ्ट बनाम राइट एंटी सेमी जॉइन के लिए कोई समर्पित नहीं है। सिंटैक्स में - हम एसक्यूएल टेक्स्ट के भीतर टेबल पोजीशन को स्विच करके बस प्रभाव प्राप्त करते हैं।


क्रॉस जॉइन करें

सभी सही पंक्तियों के साथ सभी का एक कार्टेशियन उत्पाद।

SELECT * FROM A CROSS JOIN B;

X      Y
-----  -------
Amy    Lisa
John   Lisa
Lisa   Lisa
Marco  Lisa
Phil   Lisa
Amy    Marco
John   Marco
Lisa   Marco
Marco  Marco
Phil   Marco
Amy    Phil
John   Phil
Lisa   Phil
Marco  Phil
Phil   Phil
Amy    Tim
John   Tim
Lisa   Tim
Marco  Tim
Phil   Tim
Amy    Vincent
John   Vincent
Lisa   Vincent
Marco  Vincent
Phil   Vincent

क्रॉस ज्वाइन, ज्वाइन कंडीशन के साथ इनर जॉइन के बराबर है जो हमेशा मेल खाता है, इसलिए निम्न क्वेरी उसी परिणाम को लौटा देती है:

SELECT * FROM A JOIN B ON 1 = 1;

स्व शामिल हों

यह केवल अपने साथ शामिल होने वाली तालिका को दर्शाता है। एक स्व-जुड़ाव ऊपर चर्चा किए गए प्रकारों में से कोई भी हो सकता है। उदाहरण के लिए, यह एक आंतरिक स्व-जुड़ाव है:

SELECT * FROM A A1 JOIN A A2 ON LEN(A1.X) < LEN(A2.X);

X     X
----  -----
Amy   John
Amy   Lisa
Amy   Marco
John  Marco
Lisa  Marco
Phil  Marco
Amy   Phil


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow