2009-01-19 3 views
8

मैं इस तरह एक Oracle एसक्यूएल अभिव्यक्ति लिखा है:मिश्रण "का उपयोग" और "पर" Oracle एएनएसआई में शामिल होने के

SELECT 
... 
FROM mc_current_view a 
JOIN account_master am USING (account_no) 
JOIN account_master am_loan ON (am.account_no = am_loan.parent_account_no) 
JOIN ml_client_account mca USING (account_no) 

जब मैंने इसे चलाने का प्रयास, ओरेकल के साथ लाइन में एक त्रुटि फेंकता "ऑन" आत्म -जॉइन कह रहा है: "ओआरए -25154: क्लॉजिंग का कॉलम हिस्सा क्वालीफायर नहीं हो सकता है"।

यदि मैं "एम" क्वालीफायर को छोड़ देता हूं, तो यह कहता है: "ओआरए -00 9 18: कॉलम अस्पष्ट रूप से परिभाषित"।

इसे हल करने का सबसे अच्छा तरीका क्या है?

उत्तर

13

त्रुटि संदेश वास्तव में है (आश्चर्य!) आपको बता रहा है कि समस्या क्या है। एक बार जब आप किसी विशेष कॉलम के लिए उपयोगिंग क्लॉज का उपयोग करते हैं, तो आप उस क्वेरी नाम के लिए कॉलम क्वालीफायर/टेबल उपनाम का उपयोग अपनी क्वेरी के किसी अन्य भाग में नहीं कर सकते। इसके समाधान के लिए एक ही रास्ता अपने प्रश्न में कहीं भी उपयोग कर खंड का उपयोग नहीं करने, जब से तुम दूसरी में शामिल होने के शर्त पर क्वालीफायर के लिए है:

SELECT 
... 
FROM mc_current_view a 
JOIN account_master am ON (a.account_no = am.account_no) 
JOIN account_master am_loan ON (am.account_no = am_loan.parent_account_no) 
JOIN ml_client_account mca ON (a.account_no = mca.account_no); 
+1

क्या आप कृपया इसके लिए एक रेफरी दे सकते हैं: "एक बार जब आप किसी विशेष कॉलम के लिए यूएसआईंग क्लॉज का उपयोग करते हैं, तो आप उस कॉलम क्वालीफायर/टेबल उपनाम का उपयोग उस कॉलम नाम के लिए अपनी क्वेरी के किसी अन्य भाग में नहीं कर सकते।" यह एक बेवकूफ बाधा की तरह दिखता है और उपयोग करने के एकमात्र अस्तित्व को अमान्य करता है। – TWiStErRob

+0

यह बहुत लंबा रहा है मेरे पास संदर्भ नहीं है। हालांकि, अगर आप इसे आजमाते हैं, तो आप देखेंगे कि यह सच है (कम से कम 10 जी में)। आईएमओ, उपयोग खंड पूरी तरह से बेकार है। – DCookie

8

मेरी प्राथमिकता का उपयोग कभी नहीं करना का उपयोग करना है; पर पर हमेशा उपयोग करें। मैं अपने एसक्यूएल को बहुत स्पष्ट होने के लिए पसंद करता हूं और उपयोग कर रहा है खंड मेरी राय में एक कदम हटा दिया गया है।

इस मामले में, त्रुटि के बारे में क्योंकि आप mc_current_view में account_no है, account_master आ रहा है, और ml_client_account ताकि वास्तविक में शामिल होने के हल नहीं किया जा सकता है। उम्मीद है की यह मदद करेगा।

0

उपयोग कर रहा है क्लीनर (IMO) लेकिन यह अभी भी वांछनीय है

select A.field, 
     B.field, 
     (select count(C.number) 
      from tableC C 
     where C.join_id = join_id -- wrong answer w/o prefix, exception with. 
     ) avg_number 
    from tableA A 
    join tableB B using (join_id); 

यह गलत जवाब क्योंकि सबक्वेरी भीतर join_id C.join_id बल्कि एक या बी की तुलना में (सभी रिकॉर्ड मिलान) का अर्थ है देता है: बाह्य या संगठन के उदाहरण के रूप में शामिल होने के खेतों इस तरह एक उदाहरण refererence को शायद हल करने का सबसे अच्छा तरीका सिर्फ दोनों संदर्भों के साथ स्पष्ट संदर्भों की अनुमति देने के लिए हो सकता है। ऐसा लगता है कि इस तरह के मामलों की आवश्यकता है।

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