9

Microsoft SQL Server 2000 で次の (完全な) SQL クエリを実行すると:

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'.

ここで何が間違っていますか?どうすれば修正できますか?

4

5 に答える 5

25

または のいずれかARTIFACTTYPEを参照でき、サーバーはどちらが必要かを知る必要があるため、この場合は変更するだけで問題ありません。A.ARTIFACTTYPEB.ARTIFACTTYPEA.ARTIFACTTYPE

明確にするために、列名があいまいな場合はいつでもエイリアスプレフィックスを指定する必要があります。常にエイリアス プレフィックスを使用することは悪い習慣ではありません。これは、クエリを読み取るときにどの列がどのテーブルから来ているかを明確にし、このような問題を排除するためです。

2 つの列が同じテーブルの同じ列を参照しているときに、必要な 2 つの列のどちらを区別する必要があるのか​​疑問に思われるかもしれません。答えは、テーブルをそれ自体に結合する場合、A.column と B.column の値が結合基準によって異なる可能性があるということです (たとえば、列の 1 つの値が異なる可能性がある外部結合の場合など)。ヌル)。

于 2008-11-25T16:54:10.070 に答える
2

それがあなたが実行している正確なクエリである場合、なぜそれが曖昧なものを見つけるのか分かりません。

同等のクエリだと思うものを書き、データベース(Oracle)で問題なく実行しました。

編集Oracleでの新しい実験の正確な出力を追加します。この実験で実行されたクエリは、OPによって指定された正確なクエリであり、テーブル名が入力されています。 その他の変更はありません。このクエリにはあいまいなものは何もありません。したがって、それが実行されている正確なクエリではないか、SQLServerにパーサーのバグがあります。

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
于 2008-11-25T17:54:46.170 に答える
1

完全なクエリをリストしていますか?おそらく、ORDERBY句もあります-それはその問題を引き起こす可能性があります

投稿されたクエリに問題はないはずだという点でデイブをサポートします

于 2008-11-25T18:14:52.153 に答える
0

明確にするために、あいまいな列があるのは13、14、および15行目です。

于 2008-11-25T17:42:38.177 に答える
0

ORDER BY次のように、句でテーブルを指定する必要があります。

ORDER BY A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME
于 2009-01-09T18:36:29.337 に答える