दिलचस्प पोस्ट
निजी शुद्ध वर्चुअल फ़ंक्शन का क्या मतलब है? varargs और ओवरलोडिंग के साथ बग? जावा स्ट्रिंग स्कैनर इनपुट सूचना के लिए इंतजार नहीं करता है, सीधे अगले बयान पर चलता है। जानकारी के लिए इंतजार कैसे करें? एंड्रॉइड में एक फाइल कैसे बनाएं? जावा में वर्तमान कार्य निर्देशिका प्राप्त करना संबंधपरक डेटाबेस डिजाइन पैटर्न? एक्सोड-सक्रिय सक्रिय डेवलपर निर्देशिका त्रुटि का चयन करें विधि अधिभार और ओवरराइड के बीच अंतर क्या है? @ वर्ग बनाम #import सी ++ स्ट्रिंग शब्दशः डेटा प्रकार का भंडारण प्रोग्राम के लिए रूट विशेषाधिकार कैसे प्राप्त करें? कैसे मैं AngularJS में मेटा टैग को अपडेट कर सकता हूं? स्क्रीन ओरियनेशन लॉक NSDecimalNumber का उपयोग कैसे करें? IOS में मेमोरी उपयोग देखना

क्रॉस जॉय करने और दो तालिकाओं के बीच अल्पविराम के बीच अंतर क्या है?

के बीच क्या अंतर है

select * from A, B 

तथा

 select * from A cross join B 

? वे उसी परिणाम वापस आते हैं।

क्या दूसरा संस्करण पहले से अधिक पसंद आया है? क्या पहले संस्करण पूरी तरह वाक्यविन्यास गलत है?

Solutions Collecting From Web of "क्रॉस जॉय करने और दो तालिकाओं के बीच अल्पविराम के बीच अंतर क्या है?"

वे उसी परिणाम वापस लौटते हैं क्योंकि वे अर्थात् समान हैं। इस:

 select * from A, B 

… है (wince) ANSI-89 वाक्यविन्यास तालिकाओं को एक साथ जोड़ने के लिए जहां एक खंड के बिना, परिणाम एक कार्टेशियन उत्पाद है। कौन सी विकल्प वैकल्पिक रूप से भी उपलब्ध कराता है:

  select * from A cross join B 

… लेकिन क्रॉस जॉइन एएनएसआई -92 वाक्यविन्यास है।

प्रदर्शन के बारे में

उनके बीच कोई प्रदर्शन अंतर नहीं है।

एएनएसआई -92 का उपयोग क्यों करें?

एएनएसआई -92 वाक्यविन्यास का उपयोग करने का कारण बाहरी संपर्क समर्थन के लिए है (आईई: बाएं, पूर्ण, सही) – एएनएसआई -89 वाक्यविन्यास में कोई भी नहीं है, इसलिए कई डाटाबेस अपने स्वयं लागू किए गए हैं (जो कि किसी भी अन्य डेटाबेस के पोर्ट नहीं है )। IE: ओरेकल का (+) , SQL सर्वर का =*

वे समान होते हैं और (लगभग) कभी भी उपयोग नहीं किए जाने चाहिए

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

 select * from A, B join C on C.SomeField = A.SomeField and C.SomeField = B.SomeField 

एक त्रुटि पैदा होगी:

मल्टी-पार्ट आइडेंटिफ़ायर "ए। कुछफिल्ड" बाध्य नहीं हो सका।

क्योंकि सी में शामिल होने से केवल बी को स्कोप होता है, जबकि क्रॉस में शामिल होने के साथ …

 select * from A cross join B join C on C.SomeField = A.SomeField and C.SomeField = B.SomeField 

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

पहला संस्करण मूल रूप से दो तालिकाओं में शामिल होने का एकमात्र तरीका था। लेकिन इसमें कई समस्याएं हैं, इसलिए जॉइन कीवर्ड एएनएसआई -92 मानक में जोड़ा गया था। वे समान परिणाम देते हैं लेकिन दूसरा अधिक स्पष्ट होता है और इसे प्राथमिकता दी जाती है।

ये अन्तर्निहित और स्पष्ट क्रॉस जुड़ने के उदाहरण हैं। http://en.wikipedia.org/wiki/Join_%28SQL%29#Cross_join देखें

क्रॉस की उपयोगिता के रूप में टिप्पणियों के लिए, पोस्टग्रेज़ जनरेट्री श्रृंखला और पोस्टगिज़ स्पेयल एसक्यूएल के अनुमानित रूप से कुछ अस्पष्ट दुनिया में क्रॉस जॉयन्स या अल्पविराम का उपयोग करने का एक बहुत उपयोगी और वैध उदाहरण है, जहां आप क्रिएशन का इस्तेमाल कर सकते हैं। एक ज्यामिति संग्रह या बहु- (बहुभुज / पॉइंट / लिंकिंग) से नौवीं ज्यामिति, देखें: http://postgis.refractions.net/documentation/manual-1.4/ST_GeometryN.html

 SELECT n, ST_AsEWKT(ST_GeometryN(the_geom, n)) As geomewkt FROM ( VALUES (ST_GeomFromEWKT('MULTIPOINT(1 2 7, 3 4 7, 5 6 7, 8 9 10)') ), ( ST_GeomFromEWKT('MULTICURVE(CIRCULARSTRING(2.5 2.5,4.5 2.5, 3.5 3.5), (10 11, 12 11))') ) ) As foo(the_geom) CROSS JOIN generate_series(1,100) n WHERE n <= ST_NumGeometries(the_geom); 

यह बहुत उपयोगी हो सकता है यदि आप क्षेत्र, केंद्रक, बाउंडिंग बॉक्स या कई अन्य आपरेशनों को प्राप्त करना चाहते हैं जो आप एक ही ज्यामिति पर कर सकते हैं, जब वे एक बड़ा एक के भीतर निहित हैं

मैंने हमेशा ऐसी क्वेरीएं लिखी हैं जो gener_series से पहले अल्पविराम का उपयोग करती हैं, एक दिन जब मुझे लगा कि यह वास्तव में क्रॉस जॉइन है, जो मुझे इस पोस्ट में लाया था। अस्पष्ट, लेकिन निश्चित रूप से उपयोगी है

पहले से दिए गए उत्तरों में जोड़ने के लिए:

 select * from A, B 

1992 एसक्यूएल मानक से पहले ही इसमें शामिल होने का एकमात्र तरीका था। इसलिए यदि आप एक आंतरिक शामिल करना चाहते हैं, तो आपको मापदंड के लिए WHERE खंड का उपयोग करना होगा:

 select * from A, B where Ax = By; 

इस वाक्य रचना के साथ एक समस्या यह थी कि बाहरी जुड़ने के लिए कोई मानक नहीं था। एक और यह था कि यह कई तालिकाओं के साथ अपठनीय नहीं है और इसलिए त्रुटियों और कम रख-रखाव की संभावना है।

 select * from A, B, C, D where B.id = C.id_b and C.id_d = D.id; 

यहां हमारे पास ए / बी / सी / डी के साथ एक क्रॉस जॉब है उद्देश्य या नहीं? हो सकता है कि प्रोग्रामर बस and B.id = A.id_b (या जो भी) भूल गया हो, या हो सकता है कि यह रेखा गलती से हटा दी गई हो, और शायद यह वास्तव में एक क्रॉस जॉइन होने का मतलब था। कौन कह सकता है?

स्पष्ट रूप से जुड़ने के साथ यहां भी यही है

 select * from A cross join B inner join C on C.id_b = B.id inner join D on D.id = C.id_d; 

अब प्रोग्रामर के इरादों के बारे में कोई संदेह नहीं है

पुरानी अल्पविराम से अलग सिंटैक्स को अच्छे कारणों से बदल दिया गया था और अब इसका उपयोग नहीं किया जाना चाहिए।