ORA-00918: 열의 정의가 애매합니다 (ORA-00918: column ambiguously defined)

ORA-00918: column ambiguously defined 오류는 설명과 같이 컬럼이 애매하거나 모호하게 설정되어 발생합니다.

주요하게 발생하는 원인 중 두 가지는 다음과 같습니다.

첫 번째는 두 테이블 간의 동일한 컬럼명이 조인 결과에 의해 같이 선택되었을 때, 외부의 뷰에서 해당 컬럼을 SELECT 시도할 때 발생합니다. 인라인뷰에서는 1번 테이블의 컬럼명, 2번 테이블의 컬럼명이 동일하게 명명되어 있는데, 외부에서 해당 컬럼명을 조회할 때 발생하게 되는 것입니다.

두 번째는 별도의 조인 없이 하나의 테이블을 조회할 때, 컬럼 개수가 많아지면서 전반부와 후반부의 컬럼명을 실수로 동일하게 설정하는 문제입니다.

ORA-00918: 열의 정의가 애매합니다 해결하기

조인에 의해 열의 정의가 애매해지는 현상

EMP테이블과 DEPT테이블은 외래키 DEPTNO가 존재합니다. 이너 조인한 결과에서 각 테이블의 DEPTNO 컬럼을 조회해 보겠습니다. 테이블을 명시하였기에 열의 정의가 애매하지는 않습니다.

SELECT EMP.DEPTNO, DEPT.DEPTNO
       FROM DEPT JOIN EMP ON EMP.DEPTNO = DEPT.DEPTNO
      WHERE EMPNO = 7839;

    DEPTNO     DEPTNO
---------- ----------
        10         10

하지만 단순히 DEPTNO를 조회하는 경우에는 이 컬럼이 {EMP 테이블}의 [DEPTNO 컬럼]을 말하는 건지, {DEPT 테이블}의 [DEPTNO 컬럼]을 말하는 건지, 열의 정의가 애매해지는 현상이 발생합니다. 그리하여 ORA-00918: 열의 정의가 애매합니다 오류가 발생합니다.

SELECT DEPTNO
       FROM DEPT JOIN EMP ON EMP.DEPTNO = DEPT.DEPTNO
      WHERE EMPNO = 7839;
SELECT DEPTNO

ERROR at line 1:
ORA-00918: column ambiguously defined

테이블의 컬럼을 동일하게 설정하여 열 정의가 애매한 현상

ORA-00918: column ambiguously defined 오류는 컬럼을 매우 길게 조회하는 경우에 실수로 발생하기도 합니다. 다음 예시는 COLUMN_NAME을 3번 명시해 보았습니다.

SELECT 1 AS COLUMN_NAME, 2 AS COLUMN_NAME, 3 AS COLUMN_NAME FROM DUAL;

COLUMN_NAME COLUMN_NAME COLUMN_NAME
----------- ----------- -----------
          1           2           3

COLUMN_NAME이 3번 명시된 인라인뷰에서 COLUMN_NAME을 조회하는 경우 이 컬럼이 어느 것을 지칭하는지 모호해지기에 오류가 발생합니다.

SELECT COLUMN_NAME
       FROM (SELECT 1 AS COLUMN_NAME, 2 AS COLUMN_NAME, 3 AS COLUMN_NAME FROM DUAL);
SELECT COLUMN_NAME

ERROR at line 1:
ORA-00918: column ambiguously defined

ORA-00918: 열의 정의가 애매합니다 해결하기

ORA-00918 오류를 해결하려면 열이 여러번 정의된 부분을 확인해 주세요. 한 테이블 내에 컬럼이 존재하는 경우도 있고, 여러 테이블을 조인하는 과정에서 다른 테이블 간의 동일한 이름을 가진 컬럼일 수도 있습니다. 해당 부분을 점검하여 해결할 수 있습니다.

간단한 수정 예시는 다음과 같습니다! 열의 정의가 애매할 때, 컬럼을 정확하게 구분할 수 있도록 앨리어스를 설정해 보겠습니다. 다음은 컬럼 이름을 모두 'COLUMN_NAME'로 설정해 보았습니다. 열의 정의가 애매하므로 오류가 발생할 것입니다.

SELECT COLUMN_NAME
  FROM (SELECT 1 AS COLUMN_NAME, 2 AS COLUMN_NAME, 3 AS COLUMN_NAME FROM DUAL);

ERROR at line 1:
ORA-00918: column ambiguously defined

수정한 예시는 다음과 같습니다. 모든 컬럼이 'COLUMN_NAME'으로 되어 있던 것을 'COLUMN_NAME_1', 'COLUMN_NAME_2', 'COLUMN_NAME_3' 으로 정의하였답니다. 이 글을 보는 여러분의 쿼리에도 컬럼 명칭이 중복된 것이 있을 거예요.

SELECT COLUMN_NAME_1
  FROM (SELECT 1 AS COLUMN_NAME_1, 2 AS COLUMN_NAME_2, 3 AS COLUMN_NAME_3 FROM DUAL);

COLUMN_NAME_1
-------------
            1

댓글