2008-11-25 60 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