2010-02-24 20 views
11

में शामिल है मेरे पास एक क्वेरी है जो दो टेबल में शामिल हो जाती है। एक तालिका में एक स्तंभ होता है जो प्रकार वर्कर होता है, और दूसरी तालिका में संख्या का प्रकार होता है। मैंने 3 ऑरैक डेटाबेस पर अपनी क्वेरी निष्पादित की है, और कुछ अजीब परिणाम देख रहा हूं, मुझे आशा है कि मुझे समझाया जा सकता है। दो डेटाबेस पर निम्नलिखित कार्यों की तरह कुछ।ओरेकल नंबर और वर्कर

select a.col1, b.somecol 
from tableA a inner join tableB b on b.col2=a.col1; 

इस क्वेरी में tableA.col1 प्रकार संख्या और tableB.col2 प्रकार वर्कर है। यह दो डेटाबेस में ठीक काम करता है लेकिन तीसरे में नहीं। तीसरे में मुझे (ओआरए -01722) त्रुटि मिलती है। तीसरे में मुझे कुछ ऐसा करने की ज़रूरत है ...

select a.col1, b.somecol 
from tableA a inner join tableB b on b.col2=to_char(a.col1); 

यह सभी डेटाबेस में काम करता है। मेरे पास सवाल क्यों है? उपर्युक्त एक सरल क्वेरी है, और असली क्वेरी थोड़ा अधिक जटिल है और बहुत सारे डेटा पुनर्प्राप्त करती है, इसलिए पहला संस्करण बहुत तेज़ है। अगर मैं इसे सभी वातावरण में काम करने के लिए प्राप्त कर सकता हूं तो यह बहुत अच्छा होगा।

क्या किसी को पता है कि यह कुछ ऑरैकल डेटाबेस में क्यों काम कर सकता है और दूसरों को डेटाटाइप पर कलाकारों के बिना नहीं? क्या कोई वैश्विक सेटिंग है जो इस तरह के व्यवहार को सक्षम करती है?

+1

मिलान मेरी पहली अनुमान होगा। ओरेकल आम तौर पर अंतर्निहित रूपांतरण की अनुमति देता है, इसलिए यह हो सकता है कि एक कॉलम अंतर्निहित रूपांतरण पास न करे ... –

+1

आपने उन सभी शब्दों को लिखा है और आपने अभी भी सटीक रूप से व्याख्या करने का प्रबंधन नहीं किया है * कैसे * पहली क्वेरी में काम नहीं करता है तीसरा डेटाबेस – APC

+0

क्षमा करें, मुझे पहली क्वेरी में ओआरए -01722 त्रुटि मिलती है, तीसरा डेटाबेस – broschb

उत्तर

15

एक कारण क्यों निहित रूपांतरण विफल हो जाता है जब जुड़ने वाले वर्कर कॉलम में डेटा होता है जो संख्यात्मक नहीं होता है। ओरेकल संभालती varchar2 को नंबर तार बदलने से जुड़ जाता है (उसकी टिप्पणी में गैरी के प्रशस्ति पत्र की जाँच), तो यह वास्तव में इस कार्यान्वित:

select a.col1, b.somecol 
from tableA a inner join tableB b on to_number(b.col2)=a.col1; 

tableB.col2 मूल्यों जो सांख्यिक नहीं हैं तो - लगता है काफी संभावना है, यह है एक स्ट्रिंग के बाद - तो यह ORA-01722: invalid number को फेंक देगा। शॉर्ट-सर्किट ओरेकल के डिफ़ॉल्ट व्यवहार को स्ट्रिंग में नंबर कॉलम को स्पष्ट रूप से कास्टिंग करके।

तथ्य यह है कि आपको अपने पहले दो वातावरण में यह समस्या नहीं मिलती है कि भाग्य कॉन्फ़िगरेशन की बात नहीं है। यह किसी भी समय हड़ताल कर सकता है, क्योंकि इसे क्वेरी को तोड़ने के लिए केवल एक गैर-संख्यात्मक स्ट्रिंग की आवश्यकता होती है। तो वास्तव में आपको सभी वातावरण में स्पष्ट रूपांतरण के साथ भागना चाहिए।

प्रदर्शन के लिए के रूप में, आप एक समारोह आधारित सूचकांक का निर्माण कर सकता है ...

create index whatever_idx on tableA (to_char(col1)) 
/
+2

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200 के बाद थोड़ा सा /sql_elements002.htm#r16c1-t41 "वर्ण संख्या के साथ वर्ण मान की तुलना करते समय, ओरेकल वर्ण डेटा को संख्यात्मक मान में परिवर्तित करता है।" –

+0

आप तालिका ए में स्ट्रिंग को उस स्ट्रिंग में डाल सकते हैं ताकि टेबल बी में गैर-न्यूमेरिक स्ट्रिंग होने पर आपको त्रुटियां नहीं मिलेंगी। यानी सीएएसटी (ए.col1 एएस वचरर (20)) –

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