2008-11-25 27 views
8

जब निम्नलिखित (पूर्ण) एसक्यूएल Microsoft SQL सर्वर पर क्वेरी 2000 पर:अस्पष्ट स्तंभ नाम त्रुटि

SELECT B.ARTIFACTTNS, B.ARTIFACTNAME, B.ARTIFACTTYPE, B.INITIALBYTES, B.TIMESTAMP1, B.FILENAME, B.BACKINGCLASS, 
     B.CHARENCODING, B.APPNAME, B.COMPONENTTNS, B.COMPONENTNAME, B.SCAMODULENAME, B.SCACOMPONENTNAME 
FROM (SELECT DISTINCT A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME 
     FROM (SELECT DISTINCT ARTIFACTTYPE, ARTIFACTTNS, ARTIFACTNAME 
      FROM CUSTPROPERTIES WHERE PNAME = 'AcmeSystemName' AND PVALUE = 'MyRuleGroup' 
        UNION SELECT DISTINCT ARTIFACTTYPE, ARTIFACTTNS, ARTIFACTNAME 
          FROM CUSTPROPERTIES WHERE PNAME = 'AcmeSystemDisplayName' AND PVALUE = 'MyRuleGroup') A, 
      (SELECT DISTINCT ARTIFACTTYPE, ARTIFACTTNS, ARTIFACTNAME 
      FROM CUSTPROPERTIES WHERE PNAME = 'AcmeSystemTargetNameSpace' AND PVALUE = 'http://MyModule') B 
WHERE A.ARTIFACTTYPE = B.ARTIFACTTYPE AND A.ARTIFACTTNS = B.ARTIFACTTNS AND A.ARTIFACTNAME = B.ARTIFACTNAME) A, BYTESTORE B 
    WHERE (A.ARTIFACTTYPE = 'BRG') AND A.ARTIFACTTYPE = B.ARTIFACTTYPE AND A.ARTIFACTTNS = B.ARTIFACTTNS AND A.ARTIFACTNAME = B.ARTIFACTNAME 
    ORDER BY ARTIFACTTYPE, ARTIFACTTNS, ARTIFACTNAME 

मैं निम्नलिखित अपवाद हो:

java.sql.SQLException: [Acme][SQLServer JDBC Driver][SQLServer] 
    Ambiguous column name 'ARTIFACTTYPE'. 

क्या मैं गलत कर रहा हूँ यहाँ और कैसे क्या मैं इसे सही कर सकता हूँ?

+0

आप अपनी क्वेरी में हर विशिष्ट से छुटकारा पा सकते हैं। –

+0

इसके अलावा, ऐसा लगता है कि आपने "वन ट्रू लुकअप टेबल" बनाया है, एक डाटा मॉडलिंग डिज़ाइन गलती इतनी आम है कि इसका अपना नाम है। हालांकि मुझे गलती हो सकती है, पैटर्न ओह दिखता है! बहुत परिचित Google शब्द है। –

उत्तर

24

क्योंकि ARTIFACTTYPE उल्लेख कर सकते हैं या तो A.ARTIFACTTYPE या B.ARTIFACTTYPE और सर्वर पता करने के लिए जो एक तुम चाहते हो की जरूरत के लिए, बस इसे A.ARTIFACTTYPE को बदल सकते हैं और आप इस मामले में ठीक किया जाना चाहिए।

स्पष्टीकरण के लिए, कॉलम नाम संदिग्ध होने पर आपको उपनाम उपसर्ग निर्दिष्ट करने की आवश्यकता है। उपनाम उपसर्गों का हमेशा उपयोग करना बुरा व्यवहार नहीं है क्योंकि यह स्पष्ट करता है कि जब आप क्वेरी पढ़ते हैं तो कौन से कॉलम आते हैं, और इस तरह के मुद्दों को समाप्त करते हैं।

कोई आश्चर्यचकित हो सकता है कि आपको दो कॉलम के बीच अंतर करने की आवश्यकता क्यों है जब वे दोनों एक ही तालिका में एक ही कॉलम को संदर्भित करते हैं। जवाब यह है कि जब आप स्वयं तालिका में शामिल होते हैं, तो A.column और B.column के मान शामिल होने के मानदंडों के आधार पर भिन्न हो सकते हैं (जैसे बाहरी बहिष्कार के मामले में हो सकता है जहां कॉलम में से किसी एक में मान हो सकते हैं शून्य)।

+0

के लिए नीचे वोट क्या है? –

+0

क्योंकि, मेरे अपने उत्तर के नीचे, मुझे नहीं पता कि इस प्रश्न में कुछ भी संदिग्ध क्यों है। विशेष रूप से, मुझे कोई अयोग्य ARTIFACTTYPE नहीं दिखाई देता है जहां ए या बी जोड़ना समझ में आता है। अस्पष्टता का मतलब क्या है इसका स्पष्टीकरण ठीक है, लेकिन मुझे संदेह है कि ओपी उन सभी को समझता है। –

+1

धन्यवाद डेव, क्वेरी को अधिक ध्यान से देखने के बाद यह प्रकट नहीं होता है कि कोई अस्पष्टता है हालांकि मैंने डेटाबेस का उपयोग किया है जो उपनाम लागू करने के बारे में बहुत पसंद करते हैं, SQL सर्वर उनमें से एक हो सकता है। किसी भी मामले में, पोस्ट किए गए प्रश्न के बावजूद, मेरा उत्तर स्पष्ट रूप से रिपोर्ट की गई त्रुटि को संबोधित करता है। –

0

स्पष्ट होने के लिए, यह लाइन 13, 14 और 15 है जिसमें अस्पष्ट कॉलम हैं।

+0

क्यों? वे लाइनें अस्पष्ट क्यों होंगी लेकिन रेखाएं 5, 6, और 7 नहीं होंगी? –

+0

मैंने शुरुआत में ऐसा ही सोचा था, लेकिन कोड के करीब देखने के बाद मैं उस – kristof

+0

पर डेव का समर्थन करता हूं, यह सुनिश्चित नहीं है कि ये रेखाएं अस्पष्ट क्यों हैं। बस आपको बता रहा है कि एमजीएमटी स्टूडियो क्या कह रहा है। 8 साल के डीबी सर्वर के साथ कुछ करने के लिए हो सकता है। मैं इसे लेता हूं आप लोगों ने एसक्यूएल सर्वर 2000 पर मूल पोस्टर के रूप में यह कोशिश की है। एसक्यूएल 2000 पर कोशिश किए बिना नीचे के वोटों के लिए धन्यवाद। – Logicalmind

2

यदि यह सही क्वेरी है जो आप चल रहे हैं, तो मुझे नहीं पता कि यह कुछ अस्पष्ट क्यों मिलेगा।

मैंने लिखा जो मुझे लगता है कि समकक्ष क्वेरी है और इसे बिना किसी समस्या के मेरे डेटाबेस (ओरेकल) में चलाया।

EDIT ओरेकल में एक नए प्रयोग के सटीक आउटपुट को जोड़ना। इस प्रयोग में निष्पादित क्वेरी ओपी द्वारा दी गई सटीक क्वेरी है, जिसमें टेबल नाम भर दिया गया है। कोई अन्य परिवर्तन। इस प्रश्न में अस्पष्ट कुछ भी नहीं है। तो, या तो यह सही क्वेरी नहीं है जिसे निष्पादित किया जा रहा है, या SQL सर्वर में पार्सर बग है।

SQL> create table props (pname varchar2(100), 
    2      pvalue varchar2(100), 
    3      artifacttype number, 
    4      artifacttns number, 
    5      artifactname number); 

Table created. 

SQL> SELECT  
    2 DISTINCT A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME 
    3 FROM 
    4 (SELECT DISTINCT 
    5  ARTIFACTTYPE, 
    6  ARTIFACTTNS, 
    7  ARTIFACTNAME 
    8 FROM props 
    9 WHERE PNAME = 'AcmeSystemName' 
10  AND PVALUE = 'MyRuleGroup' 
11 UNION 
12 SELECT DISTINCT 
13  ARTIFACTTYPE, 
14  ARTIFACTTNS, 
15  ARTIFACTNAME 
16 FROM props 
17 WHERE PNAME = 'AcmeSystemDisplayName' 
18  AND PVALUE = 'MyRuleGroup') A, 
19 (SELECT DISTINCT 
20  ARTIFACTTYPE, 
21  ARTIFACTTNS, 
22  ARTIFACTNAME 
23 FROM props 
24 WHERE PNAME = 'AcmeSystemTargetNameSpace' 
25  AND PVALUE = 'http://mymodule') B 
26 WHERE A.ARTIFACTTYPE = B.ARTIFACTTYPE 
27  AND A.ARTIFACTTNS = B.ARTIFACTTNS 
28  AND A.ARTIFACTNAME = B.ARTIFACTNAME 
29/

no rows selected 

समाप्ति संपादित

मेरे त्रुटि के आसपास प्राप्त करने के लिए सुझाव प्रत्येक चयन खंड में तालिका एक अद्वितीय उर्फ ​​देने के लिए और सभी स्तंभ संदर्भ अर्हता प्राप्त करने के लिए है। इस तरह:

SELECT 
    DISTINCT A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME 
FROM 
(SELECT DISTINCT 
    P1.ARTIFACTTYPE, 
    P1.ARTIFACTTNS, 
    P1.ARTIFACTNAME 
    FROM {PROPERTIES_TABLE_NAME} P1 
    WHERE PNAME = 'AcmeSystemName' 
     AND PVALUE = 'MyRuleGroup' 
    UNION 
    SELECT DISTINCT 
    P2.ARTIFACTTYPE, 
    P2.ARTIFACTTNS, 
    P2.ARTIFACTNAME 
    FROM {PROPERTIES_TABLE_NAME} P2 
    WHERE PNAME = 'AcmeSystemDisplayName' 
     AND PVALUE = 'MyRuleGroup') A, 
(SELECT DISTINCT 
    P3.ARTIFACTTYPE, 
    P3.ARTIFACTTNS, 
    P3.ARTIFACTNAME 
FROM {PROPERTIES_TABLE_NAME} P3 
WHERE PNAME = 'AcmeSystemTargetNameSpace' 
    AND PVALUE = 'http://mymodule') B 
WHERE A.ARTIFACTTYPE = B.ARTIFACTTYPE 
    AND A.ARTIFACTTNS = B.ARTIFACTTNS 
    AND A.ARTIFACTNAME = B.ARTIFACTNAME 
+0

आपने उपनाम नामों का उपयोग किया जहां ओपी नहीं था - यही कारण है कि यह आपके संस्करण में सही है - आपने वास्तव में समस्या को ठीक किया है। –

+0

शॉन: ऊपर दी गई क्वेरी ओपी को मेरी समस्या के बारे में सुझाव देने के लिए मेरा सुझाव है। यह नहीं है कि मैं अपने डेटाबेस में क्या चलाया। दो अलग विचार –

+0

एक ठोस उदाहरण दिखाया गया है कि मैं ओपेकल में ओपी की सटीक क्वेरी को अस्पष्टता त्रुटि के बिना चला सकता हूं। –

1

क्या आप पूरी क्वेरी सूचीबद्ध कर रहे हैं? शायद आप भी आदेश BY खंड है - यानी कि समस्या

मैं समर्थन करेगा Dave on that that तैनात क्वेरी के साथ कोई समस्या नहीं होनी चाहिए कारण बन सकता है

0

आप इस तरह ORDER BY खंड में टेबल निर्दिष्ट करने के लिए, की जरूरत है:

ORDER BY A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME 
संबंधित मुद्दे