SQL सर्वर में लेफ्ट जॉइन और राइट जॉइन के बीच अंतर


225

मैं SQL सर्वर में शामिल होने के बारे में जानता हूँ।

उदाहरण के लिए। दो टेबल 1, टेबल 2 हैं।

उनकी तालिका संरचनाएं निम्नलिखित हैं।

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

तालिका 1 डेटा निम्नानुसार है:

    Id     Name     
    -------------
    1      A        
    2      B    

तालिका 2 डेटा निम्नानुसार है:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

यदि मैं नीचे दिए गए दोनों एसक्यूएल विवरणों को निष्पादित करता हूं, तो दोनों आउटपुट समान होंगे

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

उपरोक्त SQL कथनों में बाएं और दाएं के बीच अंतर बताएं।

जवाबों:


73
Select * from Table1 left join Table2 ...

तथा

Select * from Table2 right join Table1 ...

वास्तव में पूरी तरह से विनिमेय हैं। हालाँकि Table2 left join Table1, Table1 right join Table2अंतर देखने के लिए (या इसके समरूप जोड़े ) का प्रयास करें । यह क्वेरी आपको अधिक पंक्तियाँ देनी चाहिए, क्योंकि तालिका 2 में एक आईडी के साथ एक पंक्ति है जो तालिका 1 में मौजूद नहीं है।


17
इसलिए हमें क्या ज़रूरत है RIGHT JOINअगर हम किसी भी वांछित परिणाम को सिर्फ हासिल कर सकते हैं LEFT JOIN? : पी
user1857492

1
@SilapAliyev यह वास्तव में एक बहुत अच्छा सवाल है। क्या कोई जवाब दे सकता है? : डी
इयान चू ते

21
Select * from Table1 left join Table 2तालिका 2 के Select * from Table1 right join Table 2सभी अभिलेखों को लौटाएगा। तालिका 2 के संयोग संबंधी अभिलेख । 2 इसके विपरीत तालिका 2 के सभी अभिलेखों को लौटाएगा और तालिका 1 के संयोग अभिलेखों को। इसमें सहायता करता है।
प्रोग्रामर आदगल

3
यदि आप अधिक उपयोग करते हैं तो 2 तालिकाओं का उपयोग करके, सही जोड़ का उपयोग सार्थक और पठनीय हो सकता है
ɥʇɹɐʞıɥʇɹɐʞ ouɐɯ

1
@MarkusMeskanen आप 7 शब्दों का एक सरल वाक्य बदल रहे हैं। जब यू के पास 356 लाइनों का वाक्य होता है, जिसमें कई उप-धाराएँ होती हैं और आपको लेफ्ट राइट के तर्क को बदलने की आवश्यकता होती है, तो आपको आश्चर्य होता है कि इसे केवल नए सिरे से बदलते हुए ...
प्रोग्रामर अडागल

1014

कोडप्रोजेक्ट में यह छवि होती है, जो एसक्यूएल जॉइन की सरल मूल बातें बताती है, जिनसे लिया गया है: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx एसक्यूएल जॉइन समझाया


64
वहाँ बहुत 'विस्तार' नहीं है। क्रेडिट वास्तव में मेरे बजाय कोडप्रोजेक्ट पृष्ठ पर जाना चाहिए। लेकिन मैं निश्चित रूप से ध्यान नहीं देता हूं :-)
दान टिमर

6
@ दान तैमर नहीं, आपके लिए भी श्रेय होना चाहिए! आप एक विशिष्ट और विशेष मांग को पूरा करने के लिए रीपैकेज और रीसेल करते हैं। रिटेलर्स ऐसा ही करते हैं और $$ बिलियन प्राप्त करते हैं
BKSpurgeon

मुझे लगता है कि हमें "बाहरी बहिष्कृत जोइन" के अंतिम आंकड़े के खंड में "और" स्थिति की आवश्यकता हो सकती है। मुझे लगता है कि क्वेरी को SELECT <select_list> FROM Table_A A FULL OUTER JOIN Table_B B पर A.Key = B.Key के लिए अपडेट किया जाना चाहिए। कहीं भी नहीं है और B.Key IS NULL
vinsrawraw

@vinsinraw कि जरूरत नहीं है। क्योंकि वह पहले से ही इस स्थिति से आच्छादित है JOIN Table_B b ON A.Key = B.Key:। OR स्थिति ठीक काम करती है।
दैन टिमर

यह वेन आरेखों का एक सामान्य दुरुपयोग है। मंडलियाँ A & B तालिकाओं का प्रतिनिधित्व नहीं करती हैं A & B, वृत्त A A LEFT JOIN B & cirlce B A RIGHT JOIN B है। यह भी मायने नहीं रखता कि ON स्थिति क्या है और कुंजियाँ अप्रासंगिक हैं और WHEREs हर काम नहीं करते हैं मामला। इस पृष्ठ पर मेरी टिप्पणियों और उत्तर को देखें और इस अनुभाग को फिर से लिखें
फिलीपिक्सी

37

जिस तालिका से आप डेटा ले रहे हैं, वह 'LEFT' है।
आप जिस तालिका में शामिल हो रहे हैं, वह 'राइट' है।
बाईं ओर: बाईं मेज से सभी आइटम ले लो और (केवल) सही मेज से मिलान आइटम।
राइट जॉइन: लेफ्ट टेबल से सभी आइटम राइट टेबल और (केवल) मैचिंग आइटम से लें।
इसलिए:

Select * from Table1 left join Table2 on Table1.id = Table2.id  

देता है:

Id     Name       
-------------  
1      A          
2      B      

परंतु:

Select * from Table1 right join Table2 on Table1.id = Table2.id

देता है:

Id     Name       
-------------  
1      A          
2      B   
3      C  

आप अधिक पंक्तियों वाली तालिका में कम पंक्तियों के साथ तालिका में शामिल होने के लिए सही थे
और
फिर, अधिक पंक्तियों के साथ तालिका में कम पंक्तियों के साथ तालिका में शामिल होने का
प्रयास करें:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  

22

(आंतरिक रूप से जुड़ा: रिकॉर्ड्स लौटाता है जिनमें दोनों टेबलों में मैचिंग वैल्यू होती है।

बाईं ओर का बाहरी जोड़: बाएं टेबल से सभी रिकॉर्ड लौटाएं, और राइट टेबल से मैच हुए रिकॉर्ड।

राइट (OUTER) JOIN: राइट टेबल से सभी रिकॉर्ड लौटाएं, और बाईं टेबल से मिलान रिकॉर्ड करें।

FULL (OUTER) JOIN: बाएं या दाएं टेबल में मैच होने पर सभी रिकॉर्ड लौटाएं

उदाहरण के लिए, मान लें कि हमारे पास निम्नलिखित रिकॉर्ड के साथ दो तालिका है:

तालिका ए

id   firstname   lastname
___________________________
1     Ram         Thapa
2     sam         Koirala
3     abc         xyz
6    sruthy       abc

टेबल बी

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

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

नोट: यह दो टेबल का प्रतिच्छेदन देता है।

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

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

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

इसे अपनी नमूना तालिका में लागू करें:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

परिणाम होगा:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

बाँया जोड़

नोट: TableA में सभी चयनित पंक्तियों, और TableB में किसी भी सामान्य चयनित पंक्तियों को देगा।

बाँया जोड़

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

इसे अपनी नमूना तालिका में लागू करें

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

परिणाम होगा:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

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

नोट: TableB में सभी चयनित पंक्तियों को देगा, साथ ही TableA में किसी भी सामान्य चयनित पंक्तियों को भी देगा।

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

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

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

इसे अपनी समोआ तालिका में लागू करें:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

परिणाम bw होगा:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

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

नोट: यह यूनियन ऑपरेशन के समान है, यह दोनों टेबल से सभी चयनित मान लौटाएगा।

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

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

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

इसे अपने samp [le table] में लगाएँ:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

परिणाम होगा:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

कुछ तथ्य

INNER के लिए आदेश सम्मिलित नहीं होता है

(LEFT, RIGHT या FULL) के लिए, OUTER जुड़ता है, ऑर्डर मैटर

W3schools पर और अधिक जानकारी प्राप्त करें


12
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

fromइस उदाहरण में तालिका tableA, संबंध के बाईं ओर है।

tableA <- tableB
[left]------[right]

इसलिए यदि आप बाईं तालिका से सभी पंक्तियों को लेना चाहते हैं ( tableA), भले ही दाईं तालिका में कोई मिलान न हों ( tableB), तो आप "बाएं जोड़" का उपयोग करेंगे।

और यदि आप दाईं मेज से सभी पंक्तियों को लेना चाहते हैं ( tableB), भले ही बाईं तालिका में कोई मिलान न हो ( tableA), आप उपयोग करेंगेright join

इस प्रकार, निम्नलिखित क्वेरी ऊपर उपयोग किए गए के बराबर है।

select fields
from tableB 
right join tableA on tableB.key = tableA.key

10

आप पूछ रहे हैं, "अगर मैं एक सिंटैक्स RIGHT OUTER JOINका उपयोग करके फिर से लिख सकता हूं LEFT OUTER JOINतो एक RIGHT OUTER JOINसिंटैक्स क्यों है ?" मुझे लगता है कि इस सवाल का जवाब है, क्योंकि भाषा के डिज़ाइनर उपयोगकर्ताओं पर इस तरह का प्रतिबंध नहीं लगाना चाहते थे (और मुझे लगता है कि अगर वे ऐसा करते तो उनकी आलोचना होती), जो उपयोगकर्ताओं को तालिकाओं के क्रम को बदलने के लिए मजबूर करेंगे। में FROMकुछ परिस्थितियों में खंड जब केवल प्रकार में शामिल होने के बदलते।


कभी-कभी बाएं और दाएं बाहरी जोड़ पूरी तरह से विनिमेय होते हैं, सही?
ッ ク ア

4
@ एलेक्स: वास्तव में बाएं और दाएं बाहरी जोड़ हमेशा विनिमेय होते हैं
onedaywhen

8

आपके दो कथन बराबर हैं।

ज्यादातर लोग केवल इसका उपयोग करते हैं LEFT JOINक्योंकि यह अधिक सहज लगता है, और यह सार्वभौमिक वाक्यविन्यास है - मुझे नहीं लगता कि सभी आरडीबीएमएस समर्थन RIGHT JOIN


"मुझे नहीं लगता कि सभी RDBMS समर्थन अधिकार शामिल हैं" - निश्चित रूप से, सभी RDBMS SQL का समर्थन नहीं करते हैं। लेकिन अगर आप यह अनुमान लगा रहे हैं कि कुछ एसक्यूएल उत्पाद समर्थन करते हैं, LEFTलेकिन RIGHTकृपया यह न बताएं कि कौन से हैं।
onedaywhen

10
@onedaywhen उदाहरण के लिए, SQLite 3 लागू नहीं होता है RIGHTऔर FULL OUTER JOIN : sqlite.org/omitted.html
Mac_Cain13

0

मुझे लगता है कि हमें अंतिम आंकड़े के खंड ANDमें whereशर्त की आवश्यकता हो सकती है Outer Excluding JOINताकि हमें वांछित परिणाम मिल सके A Union B Minus A Interaction B। मुझे लगता है कि क्वेरी को अपडेट करने की आवश्यकता है

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL

यदि हम उपयोग करते हैं OR, तो हम सभी परिणाम प्राप्त करेंगेA Union B


0

Table1 से बचे * Table1 से * सेलेक्ट करें। Table1.id = Table2.id पर

पहले क्वेरी में वाम में शामिल होने तुलना बाईं तरफा तालिका table1 को सही तरफा तालिका table2

जिसमें सभी के गुणों table1 , दिखाया जाएगा जबकि में table2 केवल उन्हीं प्रॉपर्टी में ही हालत सही पाने दिखाया जाएगा।

Table2 से * सेलेक्ट करें * Table1.id = Table2.id पर Table1 से दाईं ओर जुड़ें

पहले क्वेरी में सही में शामिल होने तुलना सही तरफा तालिका table1 को बाएँ तरफा तालिका table2

जिसमें सभी के गुणों table1 , दिखाया जाएगा जबकि में table2 केवल उन्हीं प्रॉपर्टी में ही हालत सही पाने दिखाया जाएगा।

दोनों प्रश्नों ही परिणाम प्राप्त होगा क्योंकि क्वेरी में तालिका घोषणा के क्रम में अलग हैं जैसे आप की घोषणा कर रहे हैं table1 और table2 में छोड़ दिया और सही में क्रमश: पहले बाएं में शामिल होने क्वेरी, और यह भी घोषणा कर table1 और table2 में दाएं और बाएं में क्रमश: दूसरा सही में शामिल होने के क्वेरी।

यही कारण है कि आपको दोनों प्रश्नों में समान परिणाम मिल रहा है। इसलिए यदि आप अलग परिणाम चाहते हैं तो क्रमशः इस दो प्रश्नों को निष्पादित करें,

Table1 से बचे * Table1 से * सेलेक्ट करें। Table1.id = Table2.id पर

Table1 से * सेलेक्ट करें * Table1.id = Table2.id पर तालिका 2 में शामिल हों


0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id परिभाषा के अनुसार: लेफ्ट जॉइन टेबल 1 से "सेलेक्ट" कीवर्ड के साथ उल्लिखित सभी कॉलम और टेबल 2 से कॉलम का चयन करता है जो "ऑन" कीवर्ड के बाद मापदंड से मेल खाता है।

इसी प्रकार, परिभाषा के अनुसार: राइट जॉइन टेबल 2 से "सेलेक्ट" कीवर्ड के साथ उल्लिखित सभी कॉलम और टेबल 1 से कॉलम का चयन करता है जो "ऑन" कीवर्ड के बाद मापदंड से मेल खाता है।

आपके प्रश्न का उल्लेख करते हुए, दोनों तालिकाओं में आईडी की तुलना आउटपुट में फेंकने के लिए आवश्यक सभी स्तंभों के साथ की जाती है। तो, दोनों तालिकाओं में आईडी 1 और 2 सामान्य हैं और परिणाम में आपके पास क्रम में पहले और दूसरे तालिकाओं से आईडी और नाम कॉलम के साथ चार कॉलम होंगे ।

*select * from Table1 left join Table2 on Table1.id = Table2.id

ऊपर अभिव्यक्ति है, यह सभी रिकॉर्ड (पंक्तियाँ) तालिका 1 और स्तंभों से मिलान के साथ ले जाता है, पहचान-पत्र तालिका 1 और तालिका 2 से तालिका 2 से,।

select * from Table2 right join Table1 on Table1.id = Table2.id**

इसी प्रकार उपरोक्त अभिव्यक्ति से, यह तालिका 1 और कॉलम से सभी रिकॉर्ड (पंक्तियाँ) लेती है, मिलान आईडी से तालिका 1 और तालिका 2 से, तालिका 2 से। (याद रखें, यह एक सही सम्मिलित है, इसलिए तालिका 2 से सभी कॉलम और नहीं तालिका 1 से माना जाएगा)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.