ओरेकल 11 जी में साइन इन करके साइन इन करें


81

क्या कोई भी मुझे बता सकता है कि क्या नीचे 2 प्रश्न वाम आउटर जॉइन या राइट आउटर जॉइन का उदाहरण हैं ??

Table Part:
Name         Null?       Type
PART_ID      NOT NULL    VARCHAR2(4)
SUPPLIER_ID              VARCHAR2(4)

PART_ID SUPPLIER_ID
P1      S1
P2      S2
P3  
P4  

Table Supplier:
Name            Null?     Type
SUPPLIER_ID NOT NULL      VARCHAR2(4)
SUPPLIER_NAME   NOT NULL  VARCHAR2(20)

SUPPLIER_ID  SUPPLIER_NAME
S1           Supplier#1
S2           Supplier#2
S3           Supplier#3

सभी आपूर्तिकर्ता चाहे वे किसी भी सप्लायर की आपूर्ति करें या न करें: सभी भागों को प्रदर्शित करें

P.Part_Id, S.Supplier_Name का चयन करें
पार्ट पी से, आपूर्तिकर्ता एस
जहां P.Supplier_Id = S.Supplier_Id (+)

P.Part_Id, S.Supplier_Name का चयन करें
पार्ट पी से, आपूर्तिकर्ता एस
जहां S.Supplier_Id (+) = P.Supplier_Id

26
आपको '(+)' नोटेशन का उपयोग करने से बचना चाहिए और स्पष्ट जॉइन का उपयोग करने के लिए प्रश्नों को अपग्रेड करना चाहिए।
जोनाथन लेफलर

1
@JonathanLeffler 100% सहमत हैं। समस्या यह है कि मैं उन लोगों के साथ काम करता हूं जो मानक संकेतन के लिए नहीं चाहते हैं। मैं मानक संकेतन के साथ नई क्वेरी लिखता हूं, लेकिन एक पुराने को संशोधित करने पर मुझे एक मिनट में शूट किया जाएगा।
ल्यूक एम

3
@JonathanLeffler मैं सहमत होता हूं, जब तक कि आप ओरेकल का उपयोग नहीं कर रहे हैं। ओरेकल जैसा कि यह वर्तमान में एएनएस सिंटैक्स के साथ-साथ आंतरिक (+) ऑपरेटर आंतरिक रूप से संभाल नहीं करता है। हालांकि वे asi
एक मिथक

7
@Athth इस तरह पुरानी टिप्पणी के लिए क्षमा करें, लेकिन मैं एक खोज से इस सवाल पर आया था। खुद के रूप में, मैं ओरेकल की सिफारिशों को बिल्कुल विपरीत तरीके से समझता हूं। आपके लिंक से: " ओरेकल अनुशंसा करता है कि आप ओरेकल जॉइन सिंटैक्स के बजाय ओआरएम जॉइन सिंटैक्स का उपयोग करते हैं। ओउर ज्वाइन ऑपरेटर, जो ओरेकल जॉइन ऑपरेटर (+) का उपयोग करते हैं, निम्नलिखित नियम और प्रतिबंधों के अधीन हैं, जो लागू नहीं होते हैं। क्लॉज़ ओमर जॉय सिंटैक्स ... "
सिल्वेन लेरॉक्स

साथ ही पुरानी प्रतिक्रिया के लिए क्षमा करें :), लेकिन ओरेकल क्या कहता है, और इसके आँकड़े प्रश्नों को अनुकूलित करने के लिए कैसे काम करते हैं, दो अलग-अलग चीजें हैं, और यह हो सकता है कि ओरेकल ने अपने आंतरिक आशावादियों के लिए अग्रिम के साथ-साथ अपने रुख को बदल दिया है
एक मिथक

जवाबों:


188

TableA LEFT OUTER JOIN TableBके बराबर है TableB RIGHT OUTER JOIN Table A

ओरेकल (+)में, JOIN में "वैकल्पिक" तालिका को दर्शाता है। तो आपकी पहली क्वेरी में, यह ए P LEFT OUTER JOIN S। आपकी दूसरी क्वेरी में, यह है S RIGHT OUTER JOIN Pवे कार्यात्मक रूप से समतुल्य हैं।

शब्दावली में, राइट या लेफ्ट निर्दिष्ट करते हैं कि किस पक्ष में हमेशा एक रिकॉर्ड होता है, और दूसरा पक्ष शून्य हो सकता है। तो एक में P LEFT OUTER JOIN S, Pहमेशा एक रिकॉर्ड होगा क्योंकि यह पर है LEFT, लेकिन Sअशक्त हो सकता है।

अतिरिक्त विवरण के लिए java2s.com से इस उदाहरण को देखें ।


स्पष्ट करने के लिए, मुझे लगता है कि मैं कह रहा हूं कि शब्दावली मायने नहीं रखती, क्योंकि यह केवल कल्पना करने में मदद करने के लिए है। क्या मायने रखता है कि आप इस अवधारणा को समझते हैं कि यह कैसे काम करता है।


राइट बनाम लेफ्ट

मैं कुछ भ्रम के बारे में देखा है जो निहितार्थ वाक्य रचना में सही बनाम बाएँ का निर्धारण करने में क्या मायने रखता है।

बाईं ओर का बाहरी जोड़

SELECT *
FROM A, B
WHERE A.column = B.column(+)

सही जॉय शामिल हैं

SELECT *
FROM A, B
WHERE B.column(+) = A.column

मैंने जो भी किया था, उसमें शर्तों का पक्ष था, लेकिन वे अभी भी कार्यात्मक रूप से समतुल्य हैं। (उस बारे में अधिक जानकारी के लिए मेरे उत्तर में उच्चतर देखें।) प्लेसमेंट का लक्ष्य (+)सही या LEFT निर्धारित करता है। (विशेष रूप से, अगर (+)दाईं ओर है, तो यह एक बाईं (+)ओर है । यदि बाईं ओर है, तो यह सही जगह है।)


जोइन के प्रकार

JOIN की दो शैलियाँ निहित JOIN और स्पष्ट JOINs हैं । वे JOINs लिखने की अलग शैली हैं, लेकिन वे कार्यात्मक रूप से समकक्ष हैं।

इस SO प्रश्न को देखें ।

सभी जगह एक साथ सभी सूचियाँ लागू करें । WHERE क्लॉज में शामिल होने की शर्तें निर्दिष्ट हैं।

निहित जोइन

SELECT *
FROM A, B
WHERE A.column = B.column(+)

स्पष्ट जॉइन एसोसिएट्स एक WHERE क्लॉज के बजाय एक विशिष्ट तालिका को शामिल करने की शर्तों के साथ जुड़ते हैं।

स्पष्ट शब्द

SELECT *
FROM A
LEFT OUTER JOIN B ON A.column = B.column

इन निहितार्थों को पढ़ना और समझना अधिक कठिन हो सकता है, और इनकी कुछ सीमाएँ भी होती हैं क्योंकि अन्य WHERE की शर्तों में शामिल होने की शर्तों को मिलाया जाता है। इस प्रकार, स्पष्ट रूप से स्पष्ट वाक्यविन्यास के पक्ष में निहित जॉइन की सिफारिश की जाती है।


3
ठीक है, मैं इसे अभी प्राप्त करता हूं - जोइन (+) की उपस्थिति से निहित है। ठंडा।
केरेक एस.बी.

2
@ माइक: यही तरीका है कि + सिंटैक्स काम करता है। इसका अर्थ है "वैकल्पिक", इसलिए इसे "सभी भागों की सूची, वैकल्पिक रूप से आपूर्तिकर्ता मिलान करें" जैसे पढ़ें।
केरेक एस.बी.

2
@ माइक: जब तक आप जानते हैं कि आप क्या चयन कर रहे हैं, यह वास्तव में मायने नहीं रखता कि आप इसे कैसे कहते हैं। लेकिन अपने आप को एक एहसान करो और JOINइसके बजाय मुहावरेदार वाक्यविन्यास का उपयोग करें! फिर भ्रम की कोई गुंजाइश नहीं है।
केरेक एसबी जूल

1
@TomJMuthirenthi स्पष्ट FULL OUTER JOINसिंटैक्स का उपयोग किए बिना , आपको UNION [ALL]दो परिणाम सेट एक साथ करने की आवश्यकता होगी : एक ए = बी (+) और एक बी = ए (+) के लिए। इस प्रश्न में उदाहरण ।
वाइजगू

1
"(+)" तालिका के स्तंभों पर जाता है जो नलियों की परतें बनाता है।
फिलीपिक्‍स

9

वे दो प्रश्न प्रदर्शन कर रहे हैं OUTER JOIN। निचे देखो

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

  • आप (+) ऑपरेटर को एक क्वेरी ब्लॉक में निर्दिष्ट नहीं कर सकते जिसमें FROM क्लॉज भी सिंटैक्स में शामिल है।

  • (+) ऑपरेटर FROM क्लॉज में केवल WHERE क्लॉज में या बाएं-सहसंबंध (जब TABLE क्लॉज को निर्दिष्ट करता है) के संदर्भ में प्रकट हो सकता है, और केवल एक टेबल या व्यू के कॉलम में लागू किया जा सकता है।

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

  • यदि आप बाहरी क्वेरी में एक तालिका और आंतरिक तालिका में अन्य तालिका निर्दिष्ट करते हैं, तो (+) ऑपरेटर बाहरी जुड़ाव उत्पन्न नहीं करता है।

  • आप (+) ऑपरेटर का उपयोग स्वयं से किसी तालिका में बाहरी रूप से जुड़ने के लिए नहीं कर सकते हैं, हालाँकि स्वयं जुड़ना मान्य है। उदाहरण के लिए, निम्नलिखित कथन मान्य नहीं है:

    -- The following statement is not valid:
    SELECT employee_id, manager_id
       FROM employees
       WHERE employees.manager_id(+) = employees.employee_id;
    

    हालाँकि, निम्नलिखित स्व शामिल मान्य है:

    SELECT e1.employee_id, e1.manager_id, e2.employee_id
       FROM employees e1, employees e2
       WHERE e1.manager_id(+) = e2.employee_id
       ORDER BY e1.employee_id, e1.manager_id, e2.employee_id;
    
  • (+) ऑपरेटर को केवल एक कॉलम पर लागू किया जा सकता है, एक मनमाना अभिव्यक्ति के लिए नहीं। हालांकि, एक मनमाना अभिव्यक्ति में (+) ऑपरेटर के साथ चिह्नित एक या अधिक कॉलम हो सकते हैं।

  • जहां (+) ऑपरेटर वाली स्थिति को OR तार्किक ऑपरेटर का उपयोग करके किसी अन्य शर्त के साथ जोड़ा नहीं जा सकता है।

  • एक अभिव्यक्ति के साथ (+) ऑपरेटर के साथ चिह्नित कॉलम की तुलना करने के लिए WHERE की स्थिति IN तुलना स्थिति का उपयोग नहीं कर सकती है।

यदि WHERE क्लॉज में ऐसी स्थिति होती है जो किसी कॉलम की तालिका B से स्थिरांक के साथ तुलना करती है, तो (+) ऑपरेटर को कॉलम पर लागू किया जाना चाहिए ताकि Oracle तालिका A से उन पंक्तियों को लौटा दे, जिसके लिए उसने इस स्तंभ के लिए नल बनाए हैं। अन्यथा ओरेकल केवल एक साधारण जॉइन का परिणाम देता है।

एक ऐसी क्वेरी में जो दो जोड़े से अधिक तालिकाओं के बाहरी जोड़ का प्रदर्शन करती है, एक एकल तालिका केवल एक ही तालिका के लिए अशक्त तालिका हो सकती है। इस कारण से, आप A (B) के लिए ज्वाइनिंग कंडीशन में B के कॉलम (+) ऑपरेटर को लागू नहीं कर सकते हैं और बाहरी जॉइन के लिए सिंटैक्स के लिए B और C. के लिए ज्वाइन कंडीशन को सेलेक्ट करते हैं।

Http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries006.htm से लिया गया


4

मैंने ऊपर दिए गए उत्तरों में कुछ विरोधाभास देखे, मैंने सिर्फ Oracle 12c पर निम्नलिखित की कोशिश की और निम्नलिखित सही है:

बाईं ओर का बाहरी जोड़

SELECT *
FROM A, B
WHERE A.column = B.column(+)

सही जॉय शामिल हैं

SELECT *
FROM A, B
WHERE B.column(+) = A.column

0

बाईं ओर का बाहरी जोड़

चुनें * ए, बी से जहां ए। कॉलम = बी। कॉलम (+)

सही जॉय शामिल हैं

चयन करें * ए, बी से जहां A.column (+) = B.column


-2

इस थ्रेड में कुछ गलत जानकारी है। मैंने गलत जानकारी कॉपी और पेस्ट की:

बाईं ओर का बाहरी जोड़

SELECT *
FROM A, B
WHERE A.column = B.column(+)

सही जॉय शामिल हैं

SELECT *
FROM A, B
WHERE B.column(+) = A.column

ऊपर गलत है !!!!! यह उल्टा है। मैंने यह कैसे निर्धारित किया कि यह निम्नलिखित पुस्तक से गलत है:

Oracle 9i के लिए Oracle OCP परिचय: SQL परीक्षा गाइड । पृष्ठ ११५ तालिका ३-१ में इस पर एक अच्छा सारांश है। मैं समझ नहीं पाया कि मेरी परिवर्तित एसक्यूएल तब तक ठीक से काम नहीं कर रही थी जब तक कि मैं पुराने स्कूल में नहीं गया था और एक मुद्रित पुस्तक में देखा था!

इस पुस्तक का सारांश इस प्रकार है, रेखा द्वारा पंक्तिबद्ध:

ओरेकल बाहरी सम्मिलित सिंटैक्स:

from tab_a a, tab_b b,                                       
where a.col_1 + = b.col_1                                     

ANSI / ISO समतुल्य:

from tab_a a left outer join  
tab_b b on a.col_1 = b.col_1

यहाँ ध्यान दें कि यह ऊपर पोस्ट की गई चीज़ों का उल्टा है। मुझे लगता है कि इस पुस्तक के लिए इरेटा होना संभव है, हालांकि मुझे इस पुस्तक पर इस धागे में जो है उससे कहीं अधिक भरोसा है। यह जोर से रोने के लिए एक परीक्षा गाइड है ...


4
यह मेरे जवाब से जुड़ा हुआ है, जो कि Oracle डेटाबेस 10g SQL (ओसबोर्न ओर्केल प्रेस सीरीज़) के प्रथम संस्करण (20 फरवरी, 2004) का एक अंश है, जिसमें कहा गया है: "बाईं ओर के बाहरी भाग में, बाहरी रूप से संचालक वास्तव में है समानता ऑपरेटर का अधिकार। " यहां आपके उदाहरण का डेमो दिया गया हैa.col_1(+) = b.col_1मैच राइट जॉइन के परिणाम , लेफ्टिनेंट जॉइन नहीं।
वाइजगू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.