ORA-00918: column ambiguously defined 오류는 설명과 같이 컬럼이 애매하거나 모호하게 설정되어 발생합니다.
주요하게 발생하는 원인 중 두 가지는 다음과 같습니다.
첫 번째는 두 테이블 간의 동일한 컬럼명이 조인 결과에 의해 같이 선택되었을 때, 외부의 뷰에서 해당 컬럼을 SELECT 시도할 때 발생합니다. 인라인뷰에서는 1번 테이블의 컬럼명, 2번 테이블의 컬럼명이 동일하게 명명되어 있는데, 외부에서 해당 컬럼명을 조회할 때 발생하게 되는 것입니다.
두 번째는 별도의 조인 없이 하나의 테이블을 조회할 때, 컬럼 개수가 많아지면서 전반부와 후반부의 컬럼명을 실수로 동일하게 설정하는 문제입니다.
조인에 의해 열의 정의가 애매해지는 현상
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