2008-10-20 8 views
79

एक क्रॉस जॉइन दो सेटों के tuples पर एक कार्टशियन उत्पाद प्रदर्शन करता है।क्रॉस जॉइन के लिए क्या उपयोग हैं?

SELECT * 
FROM Table1 
CROSS JOIN Table2 

कौन सी परिस्थितियां ऐसे SQL ऑपरेशन को विशेष रूप से उपयोगी प्रदान करती हैं?

+19

यह वास्तव में दुखद है कि यह प्रश्न बंद कर दिया गया है। मुझे लगता है कि इसे सामुदायिक विकी चिह्नित किया जा सकता है, लेकिन कहने के लिए कि यह रचनात्मक नहीं है अनुचित है। –

+0

मैं सहमत हूं। इसने मेरे पास सही प्रश्न का उत्तर दिया। – Hades

+0

ऐसे समय होते हैं जब एक नए डेवलपर को उपयोग किए जा रहे सॉफ़्टवेयर के कुछ कार्यों के प्रभाव को समझने में परेशानी होती है। इस तरह के प्रश्न नए देवताओं के लिए विशिष्टता सहायक हैं, मुख्य रूप से क्योंकि चर्चा जो जूनियर देव ने कभी भी विचार नहीं की है, कई संभावनाओं को प्रकाशित करती है। प्रश्न का प्रारूप प्राथमिक है, सबसे अच्छा, लेकिन इरादा ईमानदार प्रतीत होता है कि यह पूछता है "यह भी क्यों मौजूद है?" मैं वेन कोआर्ट्स से सहमत हूं, यह एक शर्म की बात है कि कैस्पर ने इसे बंद करने के लिए चुना और इसे "रचनात्मक नहीं" कहा। "रचनात्मक नहीं" भाग विशेष रूप से मुझे परेशान करता है। – Kaorie

उत्तर

71

आप एक "ग्रिड" है कि आप कपड़ों के एक विशेष लेख के लिए आकार और रंग जानकारी की तरह पूरी तरह से पॉप्युलेट करने के लिए, चाहते हैं:

select 
    size, 
    color 
from 
    sizes CROSS JOIN colors 

शायद तुम एक तालिका में हर मिनट के लिए एक पंक्ति है चाहता हूँ दिन, और आप की पुष्टि है कि एक प्रक्रिया के प्रत्येक मिनट मार डाला गया है इसका उपयोग करना चाहते है, तो आप तीन तालिकाओं को पार कर सकता है:

select 
    hour, 
    minute 
from 
    hours CROSS JOIN minutes 

या आप है कि आप हर महीने के लिए लागू करना चाहते हैं मानक रिपोर्ट चश्मा का एक सेट है वर्ष में:

select 
    specId, 
    month 
from 
    reports CROSS JOIN months 

इन्हें विचारों के रूप में बनाए रखने में समस्या यह है कि ज्यादातर मामलों में, आप विशेष रूप से कपड़े के संबंध में एक पूर्ण उत्पाद नहीं चाहते हैं। आप कुछ संयोजनों को हटाने के लिए क्वेरी में MINUS तर्क जोड़ सकते हैं, लेकिन आपको किसी अन्य तरीके से तालिका को पॉप्युलेट करना आसान हो सकता है और कार्टेशियन उत्पाद का उपयोग नहीं करना आसान हो सकता है।

इसके अलावा, आप उन टेबलों पर क्रॉस में शामिल होने का प्रयास कर सकते हैं जिनके बारे में शायद कुछ और पंक्तियां हैं, या शायद आपके WHERE खंड आंशिक रूप से या पूरी तरह गायब थे। उस स्थिति में, आपका डीबीए तुरंत आपको चूक के बारे में सूचित करेगा। आमतौर पर वह खुश नहीं होगा।

+5

_... उस स्थिति में, आपका डीबीए तुरंत आपको चूक के बारे में सूचित करेगा। आमतौर पर वह खुश नहीं होगा ._ ... हाहा, इतना सच! – RSW

+2

@ डेव: दूसरा उदाहरण नहीं होगा बस क्रॉस जॉइन मिनट? – Rakesh

+0

@ राकेश, अच्छी पकड़, मैं जो कुछ टाइप कर रहा था उसके अलावा मैं कुछ और सोच रहा था। फिक्स्ड। –

12

आप आमतौर पर अधिकांश डेटाबेस प्रश्नों के लिए एक पूर्ण कार्टेशियन उत्पाद नहीं चाहते हैं। संबंधपरक डेटाबेस की पूरी शक्ति यह है कि आप डीबी से अनावश्यक पंक्तियों को खींचने से बचने के लिए आपको जो भी प्रतिबंध लगा सकते हैं, उसे लागू कर सकते हैं।

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

7

परीक्षण के लिए डेटा जेनरेट करें।

1

कल्पना कीजिए कि आपके पास वस्तुओं और तिथियों (कीमतों, उपलब्धता, आदि ..) के विशिष्ट संयोजन पर जारी करने के लिए कई प्रश्न हैं। आप वस्तुओं और तिथियों को अलग-अलग अस्थायी तालिकाओं में लोड कर सकते हैं और आपके प्रश्न तालिकाओं में शामिल हो सकते हैं। यह इन खंडों में वस्तुओं और तिथियों की गणना करने के विकल्प से अधिक सुविधाजनक हो सकता है, खासकर जब से कुछ डेटाबेस एक खंड में तत्वों की संख्या को सीमित करते हैं।

9

ठीक है, यह शायद सवाल का जवाब नहीं देगा, लेकिन, यदि यह सच है (और मुझे इसके बारे में भी यकीन नहीं है) यह इतिहास का एक मजेदार सा है।

ओरेकल के प्रारंभिक दिनों में, डेवलपर्स में से एक ने महसूस किया कि उसे तालिका में प्रत्येक पंक्ति को डुप्लिकेट करने की आवश्यकता है (यह संभव है कि यह घटनाओं की एक तालिका थी और उसे इसे "ईवेंट शुरू करें" और "अंत घटना" बदलने की आवश्यकता थी) । उन्हें एहसास हुआ कि अगर उनके पास केवल दो पंक्तियों वाली एक टेबल थी, तो वह पहले दो में कॉलम चुनकर, क्रॉस में शामिल हो सकता था, और उसे बिल्कुल आवश्यकता थी। इसलिए उन्होंने एक साधारण टेबल बनाया, जिसे वह स्वाभाविक रूप से "डुएल" कहा जाता था।

बाद में, उसे ऐसा कुछ करने की ज़रूरत है जो केवल एक टेबल से चयन के माध्यम से किया जा सके, भले ही कार्रवाई के पास टेबल के साथ कुछ भी नहीं था, (शायद वह अपनी घड़ी भूल गया था और चयन के माध्यम से समय पढ़ना चाहता था से संकेत ...) उसने महसूस किया कि उसके पास अभी भी उसकी डुएल टेबल है, और इसका इस्तेमाल किया। थोड़ी देर बाद, वह दो बार मुद्रित समय को देखने से थक गया, इसलिए उसने आखिरकार पंक्तियों में से एक को हटा दिया।

ओरेकल में अन्य ने अपनी मेज का उपयोग करना शुरू किया, और आखिरकार इसे मानक ओरेकल स्थापना में शामिल करने का निर्णय लिया गया।

जो बताता है कि एक तालिका जिसका एकमात्र महत्व यह है कि इसकी एक पंक्ति में एक नाम है जिसका अर्थ है "दो"।

3

अंक तालिका की तरह कुछ लेता है, जिसमें 0-9 अंकों के लिए दस पंक्तियां होती हैं। आप परिणाम प्राप्त करने के लिए उस तालिका पर कुछ बार क्रॉस जॉइन का उपयोग कर सकते हैं जिसके परिणामस्वरूप आपको कई पंक्तियां मिलती हैं, परिणाम उचित रूप से गिने जाते हैं। इसमें कई उपयोग हैं। उदाहरण के लिए, आप किसी दिए गए वर्ष में प्रत्येक दिन के लिए सेट प्राप्त करने के लिए इसे डेटाड() फ़ंक्शन के साथ जोड़ सकते हैं।

5

कुंजी "मुझे सभी संभावित संयोजन दिखाएं"। मैंने इन्हें अन्य गणना वाले क्षेत्रों के साथ संयोजन के रूप में उपयोग किया है, फिर उनको क्रमबद्ध/फ़िल्टर किया गया है।

उदाहरण के लिए, कहें कि आप एक आर्बिट्रेज (ट्रेडिंग) एप्लिकेशन बना रहे हैं। आपके पास एक मूल्य पर उत्पादों की पेशकश करने वाले विक्रेताओं और खरीदारों को लागत पर उत्पादों की मांग करने वाले खरीदारों हैं। आप उत्पाद कुंजी (संभावित खरीदारों और विक्रेताओं से मेल खाने के लिए) पर एक क्रॉस जॉइन करते हैं, लागत और मूल्य के बीच फैलाव की गणना करते हैं, फिर क्रमबद्ध करें। इस पर आपको (मध्यस्थ) को निष्पादित करने के लिए सबसे लाभदायक व्यापार देने के लिए। लगभग हमेशा आपके पास अन्य बाध्यकारी फ़िल्टर मानदंड होंगे।

2

create a crosstab report पर क्रॉस में शामिल होने का यह एक दिलचस्प तरीका है। मैंने इसे Joe Celko's SQL For Smarties में पाया, और इसे कई बार इस्तेमाल किया है। यह थोड़ा सेटअप करता है, लेकिन निवेश के समय के लायक है।

संबंधित मुद्दे