एक क्रॉस जॉइन दो सेट के टुपल्स पर एक कार्टेशियन उत्पाद करता है।
SELECT *
FROM Table1
CROSS JOIN Table2
ऐसी परिस्थितियाँ ऐसे SQL ऑपरेशन को विशेष रूप से उपयोगी साबित करती हैं?
एक क्रॉस जॉइन दो सेट के टुपल्स पर एक कार्टेशियन उत्पाद करता है।
SELECT *
FROM Table1
CROSS JOIN Table2
ऐसी परिस्थितियाँ ऐसे SQL ऑपरेशन को विशेष रूप से उपयोगी साबित करती हैं?
जवाबों:
यदि आपके पास एक "ग्रिड" है जिसे आप पूरी तरह से आबाद करना चाहते हैं, जैसे कपड़ों के किसी विशेष लेख के लिए आकार और रंग की जानकारी:
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
खंड आंशिक या पूरी तरह से गायब है। उस स्थिति में, आपका डीबीए आपको चूक की सूचना देगा। आमतौर पर वह खुश नहीं होगी।
परीक्षण के लिए डेटा उत्पन्न करें।
आप आमतौर पर अधिकांश डेटाबेस प्रश्नों के लिए पूर्ण कार्टेशियन उत्पाद नहीं चाहते हैं। संबंधपरक डेटाबेस की पूरी शक्ति यह है कि आप डीबी से अनावश्यक पंक्तियों को खींचने से बचने के लिए आपको जो भी प्रतिबंध लगाने में दिलचस्पी हो सकती है, लागू कर सकते हैं।
मुझे लगता है कि एक विरोधाभासी उदाहरण है जहाँ आप चाहते हैं कि यदि आपके पास कर्मचारियों की एक तालिका और नौकरियों की एक तालिका है जिसे करने की आवश्यकता है और एक कर्मचारी को एक नौकरी के सभी संभावित कार्य देखना चाहते हैं।
ठीक है, यह शायद सवाल का जवाब नहीं देगा, लेकिन, अगर यह सच है (और मुझे यह भी यकीन नहीं है) यह इतिहास का एक मजेदार सा है।
ओरेकल के शुरुआती दिनों में, डेवलपर्स में से एक को एहसास हुआ कि उसे हर पंक्ति को तालिका में डुप्लिकेट करने की आवश्यकता है (उदाहरण के लिए, यह संभव है कि यह घटनाओं की एक तालिका थी और उसे अलग "स्टार्ट इवेंट" और "एंड इवेंट" को बदलने की आवश्यकता थी। प्रविष्टियों)। उन्होंने महसूस किया कि यदि उनके पास सिर्फ दो पंक्तियों वाली एक तालिका है, तो वे पहली तालिका में सिर्फ स्तंभों का चयन करते हुए, एक क्रॉस ज्वाइन कर सकते हैं, और वास्तव में उनकी आवश्यकता थी। इसलिए उन्होंने एक साधारण तालिका बनाई, जिसे उन्होंने स्वाभाविक रूप से "डुआल" कहा।
बाद में, उसे कुछ ऐसा करने की ज़रूरत है, जो केवल एक तालिका से चयन के माध्यम से किया जा सकता है, भले ही कार्रवाई का तालिका से कोई लेना-देना नहीं था, (शायद वह अपनी घड़ी भूल गया और उस समय को सिलेक्ट सोकसैट से पढ़ना चाहता था।) ।) उन्होंने महसूस किया कि वह अभी भी अपने डीयू टेबल के आसपास पड़ा हुआ था, और इसका इस्तेमाल किया। थोड़ी देर के बाद, वह दो बार मुद्रित समय देखकर थक गया, इसलिए उसने अंततः पंक्तियों में से एक को हटा दिया।
ओरेकल के अन्य लोगों ने अपनी तालिका का उपयोग करना शुरू कर दिया, और आखिरकार, इसे मानक ओरेकल इंस्टॉलेशन में शामिल करने का निर्णय लिया गया।
जो बताता है कि क्यों एक मेज जिसका एकमात्र महत्व यह है कि इसकी एक पंक्ति है एक नाम है जिसका अर्थ है "दो"।
कुंजी "मुझे सभी संभावित संयोजनों को दिखाएं"। मैंने इन्हें अन्य परिकलित फ़ील्ड्स के साथ संयोजन के रूप में उपयोग किया है, फिर उन छांटे गए / फ़िल्टर किए गए।
उदाहरण के लिए, मान लें कि आप एक मध्यस्थता (ट्रेडिंग) एप्लिकेशन का निर्माण कर रहे हैं। आपके पास विक्रेताओं को एक मूल्य पर उत्पाद प्रदान करने वाले और खरीदार एक कीमत पर उत्पादों की मांग करते हैं। आप उत्पाद कुंजी (संभावित खरीदारों और विक्रेताओं से मेल खाने के लिए) पर एक क्रॉस जॉइन करते हैं, लागत और कीमत के बीच प्रसार की गणना करते हैं, फिर डेस को सॉर्ट करते हैं। इस पर आप (बिचौलिया) को निष्पादित करने के लिए सबसे अधिक लाभदायक ट्रेडों। लगभग हमेशा आपके पास निश्चित रूप से अन्य बाउंडिंग फ़िल्टर मानदंड होंगे।
अंक तालिका की तरह कुछ लेता है, जिसमें अंक 0-9 के लिए दस पंक्तियाँ होती हैं। आप उस तालिका पर क्रॉस ज्वाइन का उपयोग कुछ समय के लिए एक परिणाम प्राप्त कर सकते हैं, जिसमें आपके लिए आवश्यक कई पंक्तियाँ होती हैं, जिसके परिणाम उचित रूप से गिने जाते हैं। इसके कई उपयोग हैं। उदाहरण के लिए, आप एक दिए गए वर्ष में हर दिन के लिए एक सेट प्राप्त करने के लिए इसे डेटैड () फ़ंक्शन के साथ जोड़ सकते हैं।
क्रॉसस्टैब रिपोर्ट बनाने के लिए क्रॉस जॉइन का उपयोग करने का यह एक दिलचस्प तरीका है । मुझे यह जो सेल्को की एसक्यूएल स्मार्टिज़ के लिए मिला , और कई बार इसका उपयोग किया है। यह थोड़ा सेटअप लेता है, लेकिन निवेश किए गए समय के लायक है।
कल्पना कीजिए कि आपके पास उन प्रश्नों की एक श्रृंखला है जिन्हें आप वस्तुओं और तिथियों (कीमतों, उपलब्धता, आदि) के एक विशिष्ट संयोजन पर जारी करना चाहते हैं। आप अलग-अलग अस्थायी तालिकाओं में आइटम और तिथियों को लोड कर सकते हैं और अपने प्रश्नों को क्रॉस तालिकाओं में शामिल कर सकते हैं। यह IN क्लाज में आइटमों और तारीखों की गणना करने के विकल्प से अधिक सुविधाजनक हो सकता है, खासकर जब से कुछ डेटाबेस में तत्वों की संख्या को एक खंड में सीमित कर देते हैं।
आप इसका उपयोग कर सकते हैं: इसमें शामिल हों : - परीक्षण के प्रयोजनों के लिए डेटा उत्पन्न करें - सभी गुणों को मिलाएं - आपको आरएच - / +, आदि के साथ रक्त समूह (ए, बी, ..) के सभी संभव संयोजन की आवश्यकता है ... - आपके उद्देश्यों के लिए;) - मैं इस क्षेत्र में विशेषज्ञ नहीं हूं;)
CREATE TABLE "HR"."BL_GRP_01"
("GR_1" VARCHAR2(5 BYTE));
REM INSERTING into BL_GRP_01
SET DEFINE OFF;
Insert into BL_GRP_02 (GR_1) values ('A');
Insert into BL_GRP_02 (GR_1) values ('B');
Insert into BL_GRP_02 (GR_1) values ('O');
Insert into BL_GRP_01 (GR_1) values (NULL);
CREATE TABLE "HR"."BL_GRP_02"
("GR_1" VARCHAR2(5 BYTE));
REM INSERTING into BL_GRP_02
SET DEFINE OFF;
Insert into BL_GRP_02 (GR_1) values ('A');
Insert into BL_GRP_02 (GR_1) values ('B');
Insert into BL_GRP_02 (GR_1) values ('O');
Insert into BL_GRP_02 (GR_1) values (NULL);
CREATE TABLE "HR"."RH_VAL_01"
("RH_VAL" VARCHAR2(5 BYTE));
REM INSERTING into RH_VAL_01
SET DEFINE OFF;
Insert into RH_VAL_01 (RH_VAL) values ('+');
Insert into RH_VAL_01 (RH_VAL) values ('-');
Insert into RH_VAL_01 (RH_VAL) values (NULL);
select distinct a.GR_1 || b.GR_1 || c.RH_VAL as BL_GRP
from BL_GRP_01 a, BL_GRP_02 b, RH_VAL_01 c
GROUP BY a.GR_1, b.GR_1, c.RH_VAL;