2008-11-25 42 views
8

當執行以下(完整的)SQL的Microsoft SQL Server 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

您可以在查詢中擺脫每個不同的。 – 2008-11-25 18:43:21

+0

此外,它看起來像你已經建立了「一個真正的查找表」,一個數據建模設計失誤如此常見,它有自己的名字。雖然我可能弄錯了,但模式看起來哦!非常熟悉。谷歌那個詞。 – 2008-11-25 19:01:33

回答

24

因爲ARTIFACTTYPE可以指A.ARTIFACTTYPEB.ARTIFACTTYPE和服務器需要知道你想要哪一個,只是將其更改爲A.ARTIFACTTYPE,你應該在這種情況下是好的。

爲了澄清,你需要指定別名前綴的時間列名不明確。總是使用別名前綴並不是一個壞習慣,因爲它可以在讀取查詢時清楚哪些列來自哪個表,並消除像這樣的問題。

有人可能會問,爲什麼你需要區分這兩個欄目之間你想,當他們都指向同一列在同一個表。答案是,當您將表連接到自身時,根據連接標準,來自A.column和B.column的值可能會有所不同(例如可能是外連接的情況,其中一列中的值可能是空值)。

+0

什麼是投票權? – 2008-11-25 21:04:46

+0

因爲,根據我自己的回答,我不明白爲什麼這個查詢中的任何內容都是模棱兩可的。特別是,我沒有看到任何不合格的ARTIFACTTYPE,其中添加A或B會有意義。你對什麼含糊不清的解釋很好,但我懷疑OP瞭解所有這些。 – 2008-11-26 13:31:33

0

需要說明的是,第13,14和15行是含糊不清的列。

2

如果這是你正在運行的精確查詢,我不知道爲什麼它會發現什麼曖昧。

我寫了什麼,我認爲是一個等效的查詢,並在我的數據庫(Oracle)的沒有問題跑了。

編輯添加在Oracle中一個新的實驗的準確輸出。在此實驗中執行的查詢是由OP給出的確切查詢,並填寫表名稱。無其他變化。這個查詢中沒有任何含糊之處。因此,這不是正在執行的確切查詢,或者SQL Server存在解析器錯誤。

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子句中的表中唯一的別名,並限定所有列引用。像這樣:

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 
1

您是否列出了完整的查詢? 也許你有也ORDER BY子句 - 這可能會導致問題

我會支持Dave on that that應該有與發佈查詢沒有問題

0

您需要ORDER BY子句中指定的表,如下所示:

ORDER BY A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME