2011-04-21 10 views
23

मुझे आश्चर्य है कि CROSS JOIN को सुरक्षित रूप से INNER JOIN के साथ सुरक्षित रूप से बदला जा सकता है जब यह पाया जाता है।क्रॉस ऑन क्लॉज के बिना INNER जॉइन के लिए समानार्थी है?

INNER JOINON या USING बिल्कुल CROSS JOIN जैसा ही है? यदि हां, तो CROSS JOIN प्रकार का आविष्कार केवल एक प्रश्न में बेहतर इरादे व्यक्त करने के लिए किया गया है?

इस सवाल का एक परिशिष्ट होगा:

का उपयोग कर अंतर हो सकता है आधुनिक और व्यापक रूप से जब CROSS JOIN ... WHERE x, INNER JOIN ... ON (x) या INNER JOIN ... WHERE (x) का उपयोग कर इस्तेमाल किया DBMSes?

धन्यवाद।

उत्तर

20

सभी आधुनिक डेटाबेस में इन सभी संरचनाओं को एक ही योजना में अनुकूलित किया गया है।

कुछ डेटाबेस (जैसे SQL Server) INNER JOIN के बाद ON स्थिति की आवश्यकता है, इसलिए आपकी तीसरी क्वेरी बस वहां पर पार्स नहीं करेगी। ,

SELECT * 
FROM s1 
JOIN s2 
ON  s1.id IN (s2.id, s3.id) 
CROSS JOIN 
     s3 

पार्स नहीं होगा, जबकि यह एक:

टेबल के

दृश्यता गुंजाइश JOIN क्रम में है, इसलिए इस क्वेरी

SELECT * 
FROM s2 
CROSS JOIN 
     s3 
JOIN s1 
ON  s1.id IN (s2.id, s3.id) 

इच्छा।

+0

उत्तर के लिए धन्यवाद। 'INNER जॉइन' के लिए मानक के अनुसार 'ON' शर्त अनिवार्य है? – Benoit

+0

@ बेनोइट: 'एसक्यूएल-9 2' के अनुसार, यह नहीं है। मेरे पास '2003' या '2008' की एक प्रति नहीं है, हालांकि। 'MySQL' को छोड़कर सभी डेटाबेस की आवश्यकता है। – Quassnoi

+0

@Quassnoi: SQLite नहीं करता है। – Benoit

2

एक कच्चे क्रॉस जॉइन एक ऐसा है जहां कोई खंड नहीं है जिसका मतलब है कि बाएं और दाएं तालिकाओं के प्रत्येक संयोजन के लिए एक रिकॉर्ड उत्पन्न होता है जहां कोई बाएं या दाएं तरफ डेटा नहीं होता है।

यदि आप एक क्रॉस में एक क्लॉज जोड़ते हैं तो यह एक आंतरिक जुड़ने के बराबर बनाता है क्योंकि जहां खंड समान आंतरिक में चालू होता है।

हालांकि, आंतरिक जुड़ने आमतौर पर उपयोग करने के लिए अच्छे होते हैं क्योंकि यह ऑन कंडीशन को आपके बाकी हिस्सों से अलग करता है जहां क्लॉज इसे समझना आसान बनाता है।

+3

आपके पहले अनुच्छेद में आप क्रॉस और आउटर उलझन में उलझन में हैं। एक खाली तालिका के साथ क्रॉस-जॉइनिंग एक खाली परिणाम जारी करता है। – Benoit