मेरा मानना है कि क्वेरी कुछ इस तरह दिखना चाहिए:
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 आउटर के व्यवहार के व्यवहार के समान नहीं होता है। यह शायद ही कभी एक फर्क पड़ता है, लेकिन यह कभी-कभी महत्वपूर्ण हो सकता है। पूरी तरह से, मानक एसक्यूएल आउटर का व्यवहार आमतौर पर जो भी आप चाहते हैं, उतना अधिक होता है, लेकिन यदि आप रिग्रेशन टेस्ट चलाते हैं और पाते हैं कि उत्तर में कोई अंतर है, तो स्पष्टीकरण यह हो सकता है कि पुरानी शैली के इंफॉर्मिक्स आउटर में चीज़ें अलग-अलग हों नए स्टाइल मानक एसक्यूएल आउटर से जुड़ता है।
इनफॉर्मैक्स वाक्यविन्यास का क्या अर्थ है? –
क्या आपने [SQLine] (http://www.sqlines.com/online) की कोशिश की है? –