2011-08-25 14 views
6

मैं Oracle करने के लिए एक इन्फोर्मिक्स जिज्ञासा को बदलने के लिए कोशिश कर रहा हूँ:Oracle में तालिकाओं में शामिल होने से (कई बाहरी मिलती है)

इन्फोर्मिक्स क्वेरी इस तरह दिखता है:

SELECT 
    r.aa, n.bb, nd.cc,u.id, ud.dd, g.attr 
FROM 
    tab1 u, tab2 ud, 
OUTER (tab3 a, tab4 n, tab5 nd, tab6 r, OUTER (tab7 g, tab8 atr)) 
WHERE 
    r.xx = n.xx AND 
    n.nas = a.nas AND 
    a.user = u.user AND 
    a.ac = g.ac AND 
    n.nas1 = nd.nas1 AND 
    u.user1 = ud.user1 AND 
    atr.sso = g.sso AND 
    UPPER(atr.name) = 'NAME' AND 
    u.id = 102 

ओरेकल क्वेरी इस तरह दिखता है:

SELECT 
    r.aa, n.bb, nd.cc,u.id, ud.dd, g.attr 
FROM 
    tab1 u 
INNER JOIN tab2 ud ON 
    u.user1 = ud.user1 AND 
    u.id = 102 
LEFT OUTER JOIN tab3 a ON a.user = u.user 
LEFT OUTER JOIN tab4 n ON n.nas = a.nas 
LEFT OUTER JOIN tab5 nd ON n.nas1 = nd.nas1 
LEFT OUTER JOIN tab6 r ON r.xx = n.xx 

मुझे यकीन नहीं है कि अन्य दो तालिकाओं में कैसे शामिल होना है।

क्या कोई मेरी मदद कर सकता है?

+0

इनफॉर्मैक्स वाक्यविन्यास का क्या अर्थ है? –

+0

क्या आपने [SQLine] (http://www.sqlines.com/online) की कोशिश की है? –

उत्तर

0

मैं जोड़ने की कोशिश करेगा इन:

LEFT OUTER JOIN tab7 g ON a.ac = g.ac 
LEFT OUTER JOIN tab8 atr ON g.sso = atr.sso AND UPPER(atr.name) = 'NAME' 
+0

टेबल्स टैब 7 और टैब 8 एक दूसरे से जुड़े हुए हैं; समग्र परिणाम बाहरी रूप से अन्य तालिकाओं में शामिल हो गया है। –

+0

'और ऊपरी (atr.name) 'शामिल होने की बाएं बाहरी प्रकृति को हटा देगा। – Ben

7

मेरा मानना ​​है कि क्वेरी कुछ इस तरह दिखना चाहिए:

SELECT r.aa, n.bb, nd.cc, u.id, ud.dd, g.attr 
    FROM   tab1 AS u 
     INNER JOIN tab2 AS v ON u.user1 = v.user1 AND u.id = 102 
    LEFT OUTER JOIN tab3 AS a ON a.user = u.user 
    LEFT OUTER JOIN tab4 AS n ON n.nas = a.nas 
    LEFT OUTER JOIN tab5 AS d ON n.nas1 = d.nas1 
    LEFT OUTER JOIN tab6 AS r ON r.xx = n.xx 
    LEFT OUTER JOIN (SELECT g.attr, g.ac 
        FROM tab7 AS x 
        JOIN tab8 AS atr ON x.sso = atr.sso 
        WHERE UPPER(atr.name) = 'NAME' 
       ) AS g ON a.ac = g.ac 

मैं उर्फ ​​'nd' सिर्फ 'घ' और 'उद' में बदल दिया 'v' के लिए ताकि सभी उपनाम एकल अक्षरों हों। इनफॉर्मिक्स नोटेशन में नेस्टेड OUTER(tab7 g, tab8 atr) स्वयं एक आंतरिक जुड़ाव है (जैसा कि मेरे संस्करण में उप-चयन में है), लेकिन परिणाम परिणाम बाहरी a.ac के साथ जुड़ गया है। यह वही है जो पुनर्लेखन कहता है।

मैंने उप-क्वेरी में WHERE क्लॉज का उपयोग किया; यदि आप पसंद करते हैं तो WHERE स्थिति को ऑन क्लॉज में छोड़ा जा सकता है। संभावना है कि अनुकूलक सही ढंग से और समकक्ष दोनों को संभालेगा। इसी प्रकार, आंतरिक जुड़ने में AND u.id = 102 को WHERE क्लॉज में रखा जा सकता है। फिर, बेहतर प्रदर्शन के लिए ऑप्टिमाइज़र शायद फ़िल्टर की स्थिति को दबाएगा।

ध्यान दें कि उप-क्वेरी में UPPER फ़ंक्शन को तालिका-स्कैन की आवश्यकता होती है - जब तक कि आपके पास UPPER(atr.name) पर कोई कार्यात्मक अनुक्रमणिका न हो।


इसका पुनरीक्षण, क्वेरी के प्रारंभिक भाग का लिप्यंतरण सटीक नहीं है।

मूल प्रश्न FROM खंड शामिल हैं:

FROM tab1 u, tab2 ud, OUTER(tab3 a, tab4 n, tab5 nd, tab6 r, OUTER(tab7 g, tab8 atr)) 

टेबल tab3, tab4, tab5 और tab6 भीतरी में शामिल हो गए एक दूसरे के लिए हैं, और परिणाम बाहरी-में शामिल हो गए tab1 और tab2 है। इसी प्रकार, tab8 आंतरिक-tab7 में शामिल हो गया है, लेकिन इसका नतीजा बाहरी से जुड़ा हुआ है-तालिका 3-6 के आंतरिक-जुड़ने के लिए। मूल जवाब मैं दे दी है (प्रश्न में रूपरेखा उत्तर के आधार पर) का उपयोग पुराने इन्फोर्मिक्स अंकन में प्रतिनिधित्व किया जाएगा:

SELECT r.aa, n.bb, nd.cc, u.id, ud.dd, g.attr 
    FROM tab1 AS u 
    JOIN tab2 AS v ON u.user1 = v.user1 AND u.id = 102 
    LEFT OUTER JOIN 
     (SELECT * 
      FROM tab3 AS a ON a.user = u.user 
      JOIN tab4 AS n ON n.nas = a.nas 
      JOIN tab5 AS d ON n.nas1 = d.nas1 
      JOIN tab6 AS r ON r.xx = n.xx 
      LEFT OUTER JOIN 
       (SELECT g.attr, g.ac 
       FROM tab7 AS x 
       JOIN tab8 AS atr ON x.sso = atr.sso 
       WHERE UPPER(atr.name) = 'NAME' 
       ) AS g ON a.ac = g.ac 
     ) AS loj 
:

FROM tab1 u, tab2 ud, 
    OUTER(tab3 a, OUTER(tab4 n, OUTER(tab5 nd, OUTER(tab6 r, OUTER(tab7 g, tab8 atr))))) 

इस प्रकार, यह के रूप में मूल प्रश्न अनुलेखन ज्यादा सही होगा

अवशिष्ट समस्या यह सुनिश्चित करेगी कि जटिल 0iउप-क्वेरी से कॉलम के लिए सही उपनाम उपयोग में हैं। ध्यान दें कि बाएं, दाएं या पूर्ण की अनुपस्थिति में, एक जॉइन को INNER में शामिल माना जाता है; भी, यदि आप बाएं, दाएं या पूर्ण निर्दिष्ट करते हैं, तो बाहरी वैकल्पिक है।

ध्यान देने योग्य एक अन्य विवरण: पुरानी शैली के व्यवहार इनफॉर्मिक्स आउटर का व्यवहार फ़िल्टर शर्तों के तहत शामिल होता है मानक SQL आउटर के व्यवहार के व्यवहार के समान नहीं होता है। यह शायद ही कभी एक फर्क पड़ता है, लेकिन यह कभी-कभी महत्वपूर्ण हो सकता है। पूरी तरह से, मानक एसक्यूएल आउटर का व्यवहार आमतौर पर जो भी आप चाहते हैं, उतना अधिक होता है, लेकिन यदि आप रिग्रेशन टेस्ट चलाते हैं और पाते हैं कि उत्तर में कोई अंतर है, तो स्पष्टीकरण यह हो सकता है कि पुरानी शैली के इंफॉर्मिक्स आउटर में चीज़ें अलग-अलग हों नए स्टाइल मानक एसक्यूएल आउटर से जुड़ता है।

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