ओरेकल "(+)" ऑपरेटर


155

मैं कुछ पुराने एसक्यूएल स्टेटमेंट्स की जांच कर रहा हूं ताकि उन्हें प्रलेखित किया जा सके और शायद उन्हें बढ़ाया जा सके।

DBMS ओरेकल है

मैं इस तरह से पढ़े गए एक बयान को नहीं समझ पाया:

select ...
from a,b
where a.id=b.id(+)

मैं (+)ऑपरेटर के बारे में उलझन में हूँ , और इसे किसी भी मंचों पर नहीं मिला ... (उद्धरण के भीतर + के लिए खोज या तो काम नहीं किया)।

वैसे भी, मैंने SQLDeveloper के 'Explain Plan' का उपयोग किया है और मुझे यह कहते हुए एक आउटपुट मिला है HASH JOIN, RIGHT OUTER, आदि।

यदि मैं (+)ऑपरेटर को क्वेरी के अंत में हटाता हूं तो क्या कोई अंतर होगा ? क्या डेटाबेस का उपयोग करने से पहले कुछ शर्त (जैसे कुछ अनुक्रमित इत्यादि) को संतुष्ट करना (+)पड़ता है ?? यह बहुत उपयोगी होगा यदि आप मुझे एक सरल समझ प्रदान कर सकते हैं, या कुछ अच्छे लिंक जहां मैं इस बारे में पढ़ सकता हूं।

धन्यवाद!


1
यह एक ऑपरेटर नहीं है। यह सिंटैक्स का एक टुकड़ा है जो जोइन को प्रभावित करता है।
दीक्षा

जवाबों:


186

यह एक ओआरएस जॉइन के लिए ओरेकल विशिष्ट नोटेशन है, क्योंकि एएनएसआई -89 प्रारूप (टेबल संदर्भ को अलग करने के लिए FROM क्लॉज में अल्पविराम का उपयोग करके) ने ओपर्स जॉइन को मानकीकृत नहीं किया था।

क्वेरी को ANSI-92 सिंटैक्स में फिर से लिखा जाएगा:

   SELECT ...
     FROM a
LEFT JOIN b ON b.id = a.id

यह लिंक जॉइन के अंतर को समझाने में बहुत अच्छा है


यह भी ध्यान दिया जाना चाहिए कि भले ही (+)काम करता है, ओरेकल इसका उपयोग नहीं करने की सिफारिश करता है :

ओरेकल अनुशंसा करता है कि आप ओरेकल जॉइन ऑपरेटर के बजाय FROMक्लॉज OUTER JOINसिंटैक्स का उपयोग करें । ओरेकल जॉइन ऑपरेटर का उपयोग करने वाले बाहरी प्रश्न (+)निम्नलिखित नियमों और प्रतिबंधों के अधीन हैं, जो FROMखंड OUTER JOINवाक्यविन्यास पर लागू नहीं होते हैं :


79
बिल्कुल सही। मेरे सिर में (+) को सीधा रखने के लिए (बाईं ओर बनाम दाईं ओर), मुझे "(कोई भी मिलान नहीं मिला तो NULL मान जोड़ने" के रूप में) (+) के बारे में सोचना पसंद है। उदाहरण के लिए, "a.id = b.id (+)" का अर्थ है b.id को NULL होना चाहिए यदि a.id के साथ कोई मेल नहीं है।
समुद्र तट

धन्यवाद..मुझे लगता है कि इसे क्लॉज से जोड़ने का परिणाम एक ही होना चाहिए !!
किरण एस

आप आधिकारिक Oracle दस्तावेज़ में एक लिंक रखना चाहते हैं: docs.oracle.com/html/A95915_01/sqopr.htm
Vargan

27

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

select * from emp, dept where emp.dept_id=dept.dept_id(+)

तो संक्षेप में, (+) को हटाने से एक महत्वपूर्ण अंतर हो सकता है लेकिन आप अपने डेटा के आधार पर कुछ समय के लिए नोटिस नहीं कर सकते हैं!


25

Oracle में, (+) JOIN में "वैकल्पिक" तालिका को दर्शाता है। तो आपकी क्वेरी में,

SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id(+)

यह टेबल 'बी' से टेबल 'ए' का एक लेफ्टिनेंट ओआरएस है। जब दूसरी तरफ (वैकल्पिक तालिका 'बी') के पास कोई डेटा नहीं है, तो यह अपने डेटा को खोए बिना 'ए' के ​​सभी डेटा को वापस कर देगा।

लेफ्ट आउटर के डायग्राम ज्वाइन करें

समान क्वेरी के लिए आधुनिक मानक सिंटैक्स होगा

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b ON a.id=b.id

या a.id=b.id(सभी डेटाबेस द्वारा समर्थित नहीं) के लिए एक आशुलिपि के साथ :

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b USING(id)

यदि आप (+) हटाते हैं तो यह सामान्य आंतरिक जुड़ाव क्वेरी होगी

ओरेकल और अन्य डेटाबेस दोनों में पुराना सिंटैक्स:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id

अधिक आधुनिक वाक्य रचना:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
INNER JOIN b ON a.id=b.id

या केवल:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
JOIN b ON a.id=b.id

भीतरी जुड़ाव का आरेख

यह केवल उन सभी डेटा को लौटाएगा जहां 'a' और 'b' टेबल 'id' का मान समान है, मतलब सामान्य भाग।

अगर आप अपनी क्वेरी को राइट जॉइन करना चाहते हैं

यह एक LEFT JOIN की तरह ही है, लेकिन स्विच किस तालिका में वैकल्पिक है।

सही बाहरी के आरेख में शामिल हों

पुराने Oracle सिंटैक्स:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id(+)=b.id

आधुनिक मानक वाक्यविन्यास:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
RIGHT JOIN b ON a.id=b.id

रेफरी और मदद:

https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187

Oracle 11g में + बाहरी साइन इन करें

https://www.w3schools.com/sql/sql_join_left.asp


सर्कल लेबल "टेबल 1" और "टेबल 2" बकवास हैं। सर्कल तत्वों के लिए सबसे सरल अर्थ आउटपुट पंक्तियाँ हैं। फिर बाएँ वर्धमान में तालिका 1 की अशक्त-विस्तारित पंक्तियाँ होती हैं और दाएँ वर्धमान में तालिका 2 की अशक्त-विस्तारित पंक्तियाँ होती हैं। मंडलियों के लिए अन्य अर्थ अस्पष्ट हैं। आपको क्या लगता है कि चित्र का क्या मतलब है? आपने उन्हें अन्य लोगों (बुरी) प्रस्तुतियों को नेत्रहीन कॉपी करने के अलावा क्यों रखा?
फिलीपिसे

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

6

व्यवहार में, + प्रतीक को सशर्त विवरण में और वैकल्पिक तालिका के किनारे पर रखा जाता है (वह जिसे सशर्त के भीतर रिक्त या अशक्त मान रखने की अनुमति है)।


(+) को स्तंभ नाम के दाईं ओर तुरंत रखा जाता है। यह उत्तर उस बारे में स्पष्ट नहीं है। "व्यवहार में" का क्या अर्थ है? (बयानबाजी।) (और आप शायद "बयान" का मतलब नहीं है।)
फिलीपींस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.