क्रॉस जॉइन = (INNER) जॉइन = कॉमा (",")
TL; DR SQL CROSS JOIN, (INNER) JOIN और अल्पविराम (",") (अल्पविराम के अलावा मूल्यांकन क्रम के लिए पूर्ववर्ती) के बीच एकमात्र अंतर यह है कि (INNER) JOIN में ON है जबकि CROSS JOIN और अल्पविराम नहीं है।
फिर से मध्यवर्ती उत्पादों
तीनों एक मध्यवर्ती वैचारिक एसक्यूएल-शैली रिलेशनल "कार्टेशियन" उत्पाद, उर्फ क्रॉस जॉइन, प्रत्येक तालिका से एक पंक्ति के सभी संभावित संयोजनों का उत्पादन करते हैं। यह चालू और / या WHERE है जो पंक्तियों की संख्या को कम करता है। एसक्यूएल फिडल
SQL मानक उत्पाद (7.5 1.b.ii) के माध्यम से <comma> <comma> (7.7 1.a) और JOIN पर <खोज स्थिति> <comma> plus WHERE (7.7 1.b) के माध्यम से परिभाषित करता है। )।
जैसा कि विकिपीडिया यह कहता है:
क्रॉस जॉइन करें
क्रोस जॉइन ज्वाइन में टेबल से पंक्तियों के कार्टेशियन उत्पाद को लौटाता है। दूसरे शब्दों में, यह उन पंक्तियों का उत्पादन करेगा जो पहली पंक्ति से प्रत्येक पंक्ति को दूसरी तालिका से प्रत्येक पंक्ति के साथ जोड़ती है।
आंतरिक रूप से जुड़ा
[...] ज्वाइन के परिणाम को टेबल में सभी रिकॉर्ड के कार्टेशियन उत्पाद (या क्रॉस जॉइन) को पहले लेने के परिणाम के रूप में परिभाषित किया जा सकता है (टेबल बी में हर रिकॉर्ड के साथ तालिका ए में प्रत्येक रिकॉर्ड का संयोजन) और फिर वापस लौटना सभी रिकॉर्ड जो सम्मिलित होने के लिए संतुष्ट करते हैं।
"इंप्रूव्ड ज्वाइन नोटेशन" सिलेक्ट स्टेटमेंट के FROM क्लॉज में, अलग करने के लिए अल्पविराम का उपयोग करते हुए, केवल जुड़ने के लिए तालिकाओं को सूचीबद्ध करता है। इस प्रकार यह एक क्रॉस जॉइन को निर्दिष्ट करता है
Re OUTER JOIN और उन पर WH vs का उपयोग करते हुए LEFT JOIN (OUTER JOIN) बनाम INNER JOIN में स्थितियां देखें ।
तालिकाओं के बीच कॉलम की तुलना क्यों करें?
जब कोई डुप्लिकेट पंक्तियाँ नहीं होती हैं:
प्रत्येक तालिका उन पंक्तियों को रखती है जो एक निश्चित फिल-इन- [[नाम-]] ब्लैंक स्टेटमेंट टेम्पलेट से एक सही कथन बनाती हैं। (यह एक सच बनाता प्रस्ताव from-- संतुष्ट --a कुछ (विशेषता) विधेय ।)
एक आधार तालिका उन पंक्तियों को रखती है जो कुछ डीबीए-दिए गए स्टेटमेंट टेम्प्लेट से एक सच्चा बयान देते हैं:
/* rows where
customer C.CustomerID has age C.Age and ...
*/
FROM Customers C
एक जॉइन्ट इंटरमीडिएट उत्पाद उन पंक्तियों को रखता है जो अपने ऑपरेंड के टेम्प्लेट के AND से एक सही कथन बनाते हैं:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
*/
FROM Customers C CROSS JOIN Movies M
आगे टेम्पलेट देने के लिए कहां और किन शर्तों पर विचार किया जाता है। मान फिर से उस टेम्पलेट को संतुष्ट करने वाली पंक्तियाँ हैं:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
AND C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
AND C.Age = 18
*/
FROM Customers C INNER JOIN Movies M
ON C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
WHERE C.Age = 18
विशेष रूप से, तालिकाओं के बीच (SQL) समानता के लिए स्तंभों की तुलना करने का अर्थ है कि टेम्पलेट के शामिल किए गए तालिकाओं के हिस्सों से उत्पाद से रखी गई पंक्तियों में उन स्तंभों के लिए समान (गैर-पूर्ण) मान है। यह सिर्फ संयोग है कि तालिकाओं के बीच समानता की तुलना में बहुत सी पंक्तियाँ आमतौर पर हटा दी जाती हैं - जो पंक्तियाँ आवश्यक हैं और जो आप चाहते हैं, उन्हें चिह्नित करने के लिए पर्याप्त है।
बस आप चाहते हैं पंक्तियों के लिए टेम्पलेट के लिए एसक्यूएल लिखें!
प्रश्नों का अर्थ (और तालिका बनाम स्थिति) देखें:
दो अलग-अलग स्तंभों के लिए किसी अन्य SQL तालिका से मिलान डेटा कैसे प्राप्त करें: इनर जॉइन और / यूनियन?
क्या मानव-पठनीय विवरण से SQL क्वेरी बनाने के लिए अंगूठे का कोई नियम है?
ओवरलोडिंग "क्रॉस जॉइन"
दुर्भाग्य से शब्द "क्रॉस जॉइन" के लिए उपयोग किया जाता है:
- मध्यवर्ती उत्पाद।
- क्रोस जॉइन।
- (INNER) एक या किसी अन्य कॉलम के किसी भी स्तंभ की तुलना किसी भी स्तंभ से नहीं करने वाले पर एक या एक साथ जोड़ें। (चूंकि वह मध्यवर्ती उत्पाद पंक्तियों में से कई को वापस करने के लिए जाता है।)
ये विभिन्न अर्थ भ्रमित हो जाते हैं। (जैसे अन्य उत्तरों और टिप्पणियों में यहां दिया गया है।)
CROSS JOIN vs (INNER) JOIN vs कॉमा का उपयोग करना
आम सम्मेलन है:
- जब आप केवल तालिकाओं के बीच कॉलम की तुलना नहीं करते हैं, तो क्रोस जॉइन का उपयोग करें। यह दिखाने के लिए कि तुलना की कमी जानबूझकर की गई थी।
- जब आप तालिकाओं के बीच कॉलम की तुलना करते हैं तो केवल (INNER) का उपयोग करें। (इसके अलावा संभवतः अन्य शर्तें।)
- अल्पविराम का उपयोग न करें।
आमतौर पर भी शर्तों के तालिकाओं पर नहीं है जहाँ एक WHERE के लिए रखा जाता है। लेकिन उन्हें एक तर्क, सही या पूर्ण (OUTER) जोइन के तर्क के लिए उचित पंक्तियाँ प्राप्त करने के लिए (n INNER) JOIN ON में डालना पड़ सकता है।
पुन: "कॉमा का उपयोग न करें" स्पष्ट जॉइन के साथ कॉमा को मिलाना गुमराह कर सकता है क्योंकि कॉमा में कम पूर्वता है। लेकिन CROSS JOIN, (INNER) JOIN और अल्पविराम के अर्थ में मध्यवर्ती उत्पाद की भूमिका को देखते हुए, कन्वेंशन के लिए तर्क का उपयोग नहीं करने के लिए ऊपर से अस्थिर हैं। एक क्रॉस जॉइन या अल्पविराम सिर्फ एक (INNER) जॉइन की तरह है जो एक सही स्थिति है। एक मध्यवर्ती उत्पाद, पर और जहां सभी संबंधित विधेय में एक परिचय देते हैं। हालाँकि, INNER JOIN ON के बारे में सोचा जा सकता है - केवल आउटपुट पंक्तियों की एक जोड़ी को खोजने पर आउटपुट पंक्ति बनाते हुए, जो ON कंडीशन को संतुष्ट करता है - यह फिर भी क्रॉस ज्वाइन पंक्तियों को पूरा करता है जो कंडीशन को पूरा करते हैं। एकमात्र कारण पर था एसक्यूएल में पूरक अल्पविराम लिखने के लिए था बाहरीमिलती है। बेशक, एक अभिव्यक्ति को इसका अर्थ स्पष्ट करना चाहिए; लेकिन जो स्पष्ट है वह इस बात पर निर्भर करता है कि किन चीजों का मतलब लिया जाता है।
रे वेन आरेख दो इंटरसेक्टिंग सर्कल के साथ एक वेन आरेख समान इनपुट के लिए INNER, LEFT, RIGHT & FULL JOIN के लिए आउटपुट पंक्तियों के बीच के अंतर को स्पष्ट कर सकता है । और जब ON बिना शर्त के TRUE होता है, तो INNER JOIN का परिणाम CROSS JOIN जैसा ही होता है। इसके अलावा यह इनपुट और आउटपुट पंक्तियों को इंटरसेक्ट, यूनिअन और एक्ज़ीक्यूट के लिए चित्रित कर सकता है । और जब दोनों इनपुट में एक ही कॉलम होता है, तो INTERSECT परिणाम मानक SQL NATURAL JOIN के समान होता है, और EXCEPT परिणाम वही होता है जो LEFT & RIGHT JOIN से जुड़े कुछ मुहावरों के लिए होता है। लेकिन यह नहीं बताता है कि (INNER) JOIN सामान्य रूप से कैसे काम करता है। यह सिर्फ पहली नज़र में प्रशंसनीय लगता है । यह इनपुट और / या आउटपुट के हिस्सों की पहचान कर सकता हैON, PKs (प्राथमिक कुंजियाँ), FKs (विदेशी कुंजियाँ) और / या चयन के विशेष मामले । आपको यह देखने के लिए यह करना होगा कि मंडलियों द्वारा दर्शाए गए सेट के तत्व वास्तव में क्या हैं । (कौन-सी मुदित प्रस्तुतियाँ कभी स्पष्ट नहीं होती हैं।) (याद रखें कि सामान्य रूप से जुड़ने के लिए आउटपुट पंक्तियों में इनपुट पंक्तियों से भिन्न शीर्षक होते हैं । और SQL टेबल बैग होते हैं जो नल के साथ पंक्तियों के सेट नहीं होते हैं ।)
CROSS JOIN
तालिकाओं के सभी संभव संयोजनों में परिणाम होगा। उदाहरण के लिए 100 पंक्तियों के साथ तालिका 1 और 100 पंक्तियों के साथ तालिका 2 में 10000 रिकॉर्ड होंगे।