복붙노트

[SQL] 모호한 열 이름 오류

SQL

모호한 열 이름 오류

마이크로 소프트 SQL 서버 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'.

어떻게 내가 여기 잘못을하고있는 중이이며 어떻게 해결 할 수 있습니까?

해결법

  1. ==============================

    1.ARTIFACTTYPE 당신이 할 일을 알고 중 하나 A.ARTIFACTTYPE 또는 B.ARTIFACTTYPE 및 서버 요구 사항을 참조 할 수 있기 때문에, 단지 A.ARTIFACTTYPE로 변경하고,이 경우에는 괜찮을 것 같네요.

    ARTIFACTTYPE 당신이 할 일을 알고 중 하나 A.ARTIFACTTYPE 또는 B.ARTIFACTTYPE 및 서버 요구 사항을 참조 할 수 있기 때문에, 단지 A.ARTIFACTTYPE로 변경하고,이 경우에는 괜찮을 것 같네요.

    명확히하기 위해, 당신은 별명이 열 이름이 모호 언제든지 앞에 지정해야합니다. 이 열이있는 쿼리를 읽기 표,을 제거해 문제에서 이와 같은오고있는 지우 만들면서 항상 별칭 접두사를 사용하는 것이 나쁜 방법이 아닙니다.

    당신은 그들이 모두 같은 테이블에서 같은 열을 참조 할 때 당신이 원하는 두 개의 열 중 어떤 구별해야하는 이유 중 하나는 궁금 할 것이다. 그 대답은 자체 테이블 가입하면 A.column 및 B.column의 값은이 열 중 하나의 값이 될 수있다 이러한 외부의 경우 일 수있는 바와 같이 기준 (조인에 따라 상이 할 수 있다는 것이다 없는).

  2. ==============================

    2.그 실행중인 정확한 쿼리의 경우, 나는 그것이 모호한 아무것도 찾을 왜 아무 생각이 없습니다.

    그 실행중인 정확한 쿼리의 경우, 나는 그것이 모호한 아무것도 찾을 왜 아무 생각이 없습니다.

    나는 내가 생각하는 것은 이에 상응하는 쿼리입니다 써서 문제없이 내 데이터베이스 (오라클)에 달렸다.

    편집은 오라클의 새로운 실험의 정확한 출력을 추가. 이 실험에서 실행 쿼리. 다른 변경에 채워진 테이블 이름과 함께 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
    
  3. ==============================

    3.당신은 전체 쿼리를 나열하고 있습니까? 아마 당신은 BY 절 또한 주문이 - 즉 그 문제를 일으킬 수

    당신은 전체 쿼리를 나열하고 있습니까? 아마 당신은 BY 절 또한 주문이 - 즉 그 문제를 일으킬 수

    나는 게시 된 쿼리에 문제가 없어야한다는 것을에 데이브을 지원하는 것

  4. ==============================

    4.명확하게하기 위해, 모호한 열이 라인 13, 14, 15에게 있습니다.

    명확하게하기 위해, 모호한 열이 라인 13, 14, 15에게 있습니다.

  5. ==============================

    5.이처럼 ORDER BY 절에있는 테이블을 지정해야합니다 :

    이처럼 ORDER BY 절에있는 테이블을 지정해야합니다 :

    ORDER BY A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME
    
  6. from https://stackoverflow.com/questions/318066/ambiguous-column-name-error by cc-by-sa and MIT license