SQL सर्वर: CROSS JOIN और FULL OUTER JOIN में क्या अंतर है?


जवाबों:


243

एक क्रॉस जॉइन दो तालिकाओं के बीच एक कार्टेसियन उत्पाद का उत्पादन करता है, जो सभी पंक्तियों के सभी संभावित संयोजनों को वापस करता है। इसका कोई onक्लॉज नहीं है क्योंकि आप हर चीज में हर चीज से जुड़ रहे हैं।

A full outer join, का संयोजन है left outerऔर right outerजुड़ता है। यह क्वेरी के whereक्लॉज से मेल खाने वाली दोनों तालिकाओं में सभी पंक्तियों को लौटाता है , और ऐसे मामलों में जहां onउन पंक्तियों के लिए शर्त को पूरा नहीं किया जा सकता है जो इसे nullअनपेक्षित क्षेत्रों के लिए मान डालता है ।

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


फिर बड़े तालिकाओं के मामले में FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id हमेशा की तुलना में तेज हो जाएगा FROM t1,t2 WHERE t1.id=t2.id?
एलेक्सकोवेल्स्की

@alexkovelsky भीतरी जोड़ अक्सर दो तालिकाओं के बीच कुछ मैच होने पर तेज होते हैं, क्योंकि अनुक्रमित का उपयोग करने का मतलब है कि यह तालिकाओं में से किसी एक पर सभी पंक्तियों को पढ़ने से परेशान नहीं करता है। एक पूर्ण बाहरी जुड़ाव हमेशा दोनों तालिकाओं (या प्रासंगिक अनुक्रमित) में सभी पंक्तियों को पढ़ना चाहिए। ऐसे मामले में जहां अनुक्रमणिका पर्याप्त नहीं है, या एक अंतर्निहित ढेर को आवश्यक स्तंभों को आउटपुट करने के लिए पढ़ना पड़ता है, फिर एक पूर्ण बाहरी जुड़ाव लगभग हमेशा एक आंतरिक जुड़ाव की तुलना में धीमा होना चाहिए।
एंड्रयू हिल

1
है outer joinतेजी से या cross join?
शफीज़ादेह

2
@ शफ़िज़ादे - वे अलग-अलग काम करते हैं।
डॉनी

9
क्या होगा अगर मैं सच पर पूरा पूरा शामिल होऊं? क्या परिणाम / प्रदर्शन CROSS JOIN के समान होगा?
वास्तुविद्

65

एक चीज जो हमेशा कुछ के लिए स्पष्ट नहीं हो सकती है वह यह है कि एक क्रॉस एक खाली तालिका (या परिणाम सेट) के साथ रिक्त तालिका (एम x एन) में शामिल होता है; इसलिए एम एक्स 0 = 0)

एक पूर्ण बाहरी जुड़ाव में हमेशा पंक्तियाँ होंगी जब तक कि M और N दोनों 0 न हों।


32

मैं अन्य उत्तरों में एक महत्वपूर्ण पहलू जोड़ना चाहूंगा, जिसने वास्तव में मुझे इस विषय को सबसे अच्छे तरीके से समझाया:

यदि 2 ज्वाइन टेबल में M और N पंक्तियाँ हैं, तो क्रॉस जॉइन हमेशा (M x N) पंक्तियों का उत्पादन करेगा, लेकिन पूर्ण बाहरी जुड़ाव MAX (M, N) से (M + N) पंक्तियों तक उत्पन्न होगा (वास्तव में कितनी पंक्तियों के आधार पर) मैच "पर" विधेय)।

संपादित करें:

तार्किक क्वेरी प्रोसेसिंग परिप्रेक्ष्य से, CROSS JOIN वास्तव में हमेशा M x N पंक्तियों का उत्पादन करता है। FULL OUTER JOIN के साथ क्या होता है कि बाएँ और दाएँ दोनों टेबल "संरक्षित" हैं, जैसे कि LEFT और RIGHT दोनों जुड़ गए। इसलिए, पंक्तियों पर संतोषजनक नहीं पंक्तियाँ, बाएँ और दाएँ दोनों तालिकाओं से परिणाम सेट में जोड़ी जाती हैं।


2
क्या वे सीमाएँ संभव 1-कई मैचों को छोड़कर हैं? एक पूर्ण बाहरी जुड़ाव अभी भी (एम एक्स एन) पंक्तियों के उत्पादन में सक्षम है।
मैक्सवेल

1
COUNT_BIG (*) से ट्रैफ़िक t CROSS JOIN प्राप्तकर्ता r और SELECT COUNT_BIG (*) FROM ट्रैफिक t पूर्ण जॉइनिपींट r (1 = 1) का चयन करें, वे समान हैं।
urlreader

2
तुम्हारा सबसे अच्छा असली जवाब है। मूल रूप से: cross joinतालिकाओं को गुणा करता है; एक full outer join, सबसे खराब स्थिति में उन्हें कहते हैं कि कितने पंक्तियों से मेल .. पर निर्भर करता है
ब्रायन पीटरसन

हां .. मैं इस गणित की तलाश कर रहा था - MAX (M, N) से (M + N) पंक्तियों तक का उत्पादन करें .. धन्यवाद मतदान हुआ।
अरूप रक्षित

1
ये गलत है। पंक्तियों पर पूरी तरह से सम्मिलित हों पंक्तियों में शामिल हों UNION इसलिए फुल जॉइन एम * एन पंक्तियों को वापस कर सकता है - संभवतः मैक्स (एम, एन) और एम + एन दोनों से अधिक है। लेकिन फिर भी एम एंड एन के एक समारोह के रूप में लौटे पंक्तियों की न्यूनतम और अधिकतम संख्या सिर्फ उपयोगी नहीं है । क्या उपयोगी है फुल जॉइन ऑन - इनर जॉइन ऑन और बेमिसाल पंक्तियों की स्पष्ट परिभाषा
3

15

क्रॉस जॉइन: क्रॉस जॉइन्स ऐसे परिणाम उत्पन्न करते हैं जिनमें दो या अधिक टेबलों से पंक्तियों के हर संयोजन से मिलकर बनता है। इसका मतलब है कि यदि तालिका A में 3 पंक्तियाँ हैं और तालिका B में 2 पंक्तियाँ हैं, तो CROSS JOIN का परिणाम 6 पंक्तियों में होगा। दो तालिकाओं के बीच कोई संबंध स्थापित नहीं है - आप सचमुच हर संभव संयोजन का उत्पादन करते हैं।

पूर्ण बाहरी जुड़ाव: एक पूर्ण OUT JOIN न तो "बाएं" है और न ही "दाएं" है - यह दोनों है! इसमें JOIN में भाग लेने वाले टेबल या परिणाम सेट दोनों में से सभी पंक्तियाँ शामिल हैं। जब JOIN के "बाईं ओर" पंक्तियों के लिए कोई मिलान पंक्तियाँ मौजूद नहीं होती हैं, तो आप "सही" पर सेट किए गए परिणाम से नल मानों को देखते हैं। इसके विपरीत, जब JOIN के "दाईं ओर" पंक्तियों के लिए कोई मेलिंग पंक्तियाँ मौजूद नहीं होती हैं, तो आप "बाएँ" पर सेट किए गए परिणाम से नल मानों को देखते हैं।


15

SQL सर्वर के लिए, CROSS JOIN and FULL OUTER JOINभिन्न हैं। CROSS JOINबस दो टेबल का कार्टेशियन उत्पाद है, जो किसी भी फ़िल्टर मापदंड या किसी भी स्थिति के बावजूद।

FULL OUTER JOINLEFT OUTER JOIN and RIGHT OUTER JOINदो तालिकाओं का अनूठा परिणाम सेट देता है । टेबल के दो कॉलम को मैप करने के लिए इसे ON क्लॉज की भी जरूरत होती है।

तालिका 1 में 10 पंक्तियाँ हैं और तालिका 2 में 20 पंक्तियाँ हैं जिनमें 5 पंक्तियाँ विशिष्ट स्तंभों से मेल खाती हैं।

फिर CROSS JOINपरिणाम सेट में 10 * 20 = 200 पंक्तियों को वापस करेगा।

FULL OUTER JOIN परिणाम सेट में 25 पंक्तियों को वापस करेगा।

FULL OUTER JOIN(या कोई भी JOIN) हमेशा कम या अधिक के बराबर सेट परिणाम देता है Cartesian Product number

के FULL OUTER JOINबराबर पंक्तियों की संख्या (पंक्तियों की संख्या द्वारा LEFT OUTER JOIN) + (पंक्तियों की संख्या RIGHT OUTER JOIN) - (पंक्तियों की संख्या INNER JOIN)।


8

वे समान अवधारणाएं हैं, इसके अलावा NULL मान लौटाया गया है।

निचे देखो:

declare @table1 table( col1 int, col2 int );
insert into @table1 select 1, 11 union all select 2, 22;

declare @table2 table ( col1 int, col2 int );
insert into @table2 select 10, 101 union all select 2, 202;

select
    t1.*,
    t2.*
from @table1 t1
full outer join @table2 t2 on t1.col1 = t2.col1
order by t1.col1, t2.col1;

/* full outer join
col1        col2        col1        col2
----------- ----------- ----------- -----------
NULL        NULL        10          101
1           11          NULL        NULL
2           22          2           202
*/

select
    t1.*,
    t2.*
from @table1 t1
cross join @table2 t2
order by t1.col1, t2.col1;

/* cross join
col1        col2        col1        col2
----------- ----------- ----------- -----------
1           11          2           202
1           11          10          101
2           22          2           202
2           22          10          101
*/

1
बहुत बढ़िया उदाहरण!
लुकास 925

1
वास्तविक डेटा उदाहरण के लिए धन्यवाद। यह स्पष्ट करता है।
डीटीसी

5

क्रॉस जॉइन करें : http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm

TLDR; 2 तालिकाओं (कार्थेसियन उत्पाद) के बीच एक संभावित संयोजन बनाता है

(पूर्ण) बाहरी जुड़ाव : http://www.w3schools.com/Sql/sql_join_full.asp

TLDR; प्रत्येक पंक्ति को दोनों तालिकाओं में लौटाता है और इसके परिणाम भी समान मान रखते हैं (मिलान में मिलान)


2

एक पूर्ण बाहरी जुड़ाव एक बाएं बाहरी जोड़ और एक सही बाहरी जुड़ता है। परिणाम सेट दोनों तालिकाओं से पंक्तियाँ लौटाता है जहाँ स्थितियाँ पूरी होती हैं लेकिन जहाँ कोई मेल नहीं है वहाँ अशक्त कॉलम लौटाता है।

क्रॉस जॉइन एक कार्टेशियन उत्पाद है जिसमें तालिकाओं में शामिल होने के लिए किसी भी शर्त की आवश्यकता नहीं होती है। परिणाम सेट में पंक्तियाँ और स्तंभ होते हैं जो दोनों तालिकाओं का गुणन होते हैं।


1

यहां एक उदाहरण दिया गया है, जिसमें फुल ओटर जॉइन और क्रोस जॉइन दोनों एक ही परिणाम सेट करते हैं, बिना NULL वापस लौटे। कृपया पूर्ण OOO JOIN के लिए ऑन क्लॉज में 1 = 1 नोट करें:

declare @table1 table (     col1    int,    col2    int ) 
declare @table2 table (     col1    int,    col2    int )

insert into @table1 select  1, 11   union all select    2, 22   

insert into @table2 select  10, 101 union all select     2, 202

select  *
from    @table1 t1 full outer join @table2 t2
    on  1 = 1
(2 पंक्ति) प्रभावित

(2 पंक्ति) प्रभावित
col1 col2 col1 कॉल 2
----------- ----------- ----------- -----------
१ ११ १०१०
२ २२ १०१०
१ १ २ २०२
२ २ २ २ २०२
select  *
from    @table1 t1 cross join @table2 t2
col1 col2 col1 कॉल 2
----------- ----------- ----------- -----------
१ ११ १०१०
२ २२ १०१०
१ १ २ २०२
२ २ २ २ २०२

(4 पंक्ति) प्रभावित

1

एसक्यूएल फुल ओवर जॉइन

  • फुल ओवर जॉइन मैच के बावजूद बाईं टेबल (टेबल 1) से और दाएं टेबल (टेबल 2) से सभी पंक्तियों को लौटाता है।

  • FULL OUTER JOIN कीवर्ड LEFT OUTER JOIN और RIGHT OUTER JOIN दोनों के परिणाम को जोड़ती है

  • SQL फुल एक्सटर्नल जॉइन को FULL JOIN के रूप में भी जाना जाता है

संदर्भ: http://datasciencemadesimple.com/sql-full-outer-join/

एसक्यूएल क्रॉस जॉइन

  • एसक्यूएल क्रोस जॉइन में, पहली तालिका के प्रत्येक पंक्ति को दूसरी तालिका की प्रत्येक पंक्ति के साथ मैप किया जाता है।

  • CROSS JOIN ऑपरेशन के परिणामस्वरूप सेट की गई पंक्तियों की संख्या पहली तालिका में पंक्तियों की संख्या के बराबर है जो दूसरी तालिका में पंक्तियों की संख्या से गुणा की गई है।

  • क्रॉस जॉइन को कार्टेशियन उत्पाद / कार्टेशियन जॉइन के रूप में भी जाना जाता है

  • तालिका A में पंक्तियों की संख्या m है, तालिका B में पंक्तियों की संख्या n है और परिणामी तालिका में m * n पंक्तियाँ होंगी

संदर्भ: http://datasciencemadesimple.com/sql-cross-join/

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