본문 바로가기
Database/Oracle

[ORACLE] ORA-00918 : 오류 원인과 해결 방법 완전 정복

by Papa Martino V 2025. 7. 27.
728x90

ORA-00918 오류 원인과 해결 방법 완전 정복
[ORACLE] ORA-00918

 

오라클 데이터베이스를 활용한 개발이나 운영 중에 ORA-00918: column ambiguously defined 오류를 접해본 경험이 있으신가요? 이 오류는 SQL을 작성하다 보면 자주 마주치게 되는 대표적인 실수 중 하나입니다. 하지만 원인과 해결 방법을 명확히 이해한다면 디버깅 시간을 대폭 단축할 수 있습니다. 본 글에서는 ORA-00918 오류의 본질, 주요 원인, 다양한 해결 방법을 구체적인 예제와 함께 분석하여 누구나 마스터할 수 있도록 안내합니다.

1. ORA-00918 오류란?

ORA-00918: column ambiguously defined는 오라클에서 동일한 이름의 컬럼이 둘 이상의 테이블에 존재할 때, 어느 테이블의 컬럼을 참조하는지 모호할 경우 발생하는 오류입니다.

이 오류는 주로 JOIN 또는 서브쿼리를 사용할 때 발생하며, 명시적인 테이블 또는 별칭(alias) 지정이 없을 경우 오라클이 컬럼을 구분하지 못해 오류를 반환하게 됩니다.


SELECT id, name FROM employees e
JOIN departments d ON e.dept_id = d.id;

위 SQL에서 id 컬럼이 두 테이블(employees, departments)에 모두 존재한다면, 어느 테이블의 id를 조회할지 모호하기 때문에 오류가 발생합니다.

2. ORA-00918 주요 원인

원인 설명
중복된 컬럼명 사용 JOIN 또는 서브쿼리에서 테이블 간 동일한 컬럼명이 있을 경우
별칭(alias) 미사용 컬럼이 어떤 테이블의 것인지 명시하지 않으면 모호성 발생
SELECT * 사용 두 개 이상의 테이블에서 * 사용 시 동일한 이름의 컬럼이 포함될 수 있음
VIEW에서 중복 컬럼 생성 View 정의 시 동일 컬럼명을 두 번 이상 지정했을 때

3. 해결 방법

ORA-00918 오류는 명시적 컬럼 지정별칭 사용만으로 대부분 해결할 수 있습니다. 아래 예시를 통해 해결 방법을 구체적으로 살펴보겠습니다.

방법 1: 테이블 별칭과 컬럼명 명시


SELECT e.id AS emp_id, e.name, d.id AS dept_id, d.name AS dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.id;

AS 키워드를 통해 명확하게 컬럼에 별칭을 부여하면 오류 없이 원하는 결과를 얻을 수 있습니다.

방법 2: SELECT * 지양


-- 잘못된 방식
SELECT * FROM employees e JOIN departments d ON e.dept_id = d.id;

-- 올바른 방식
SELECT e.id, e.name, d.name FROM employees e JOIN departments d ON e.dept_id = d.id;

SELECT * 사용은 중복 컬럼을 유발할 수 있으므로 피하는 것이 좋습니다.

방법 3: VIEW 정의 시 컬럼 중복 방지


CREATE VIEW emp_dept_view AS
SELECT e.id AS emp_id, e.name, d.name AS dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.id;

VIEW 정의 시에도 중복 컬럼명이 없도록 별칭을 부여하는 습관이 필요합니다.

4. 실제 사례 분석

한 전자상거래 플랫폼에서 고객 테이블과 주문 테이블을 JOIN하여 주문 내역을 조회하려 했으나, 다음과 같은 오류가 발생했습니다.


SELECT id, name, order_date
FROM customers c
JOIN orders o ON c.id = o.customer_id;
-- ORA-00918 오류 발생

이 경우 id 컬럼이 고객 테이블과 주문 테이블에 모두 존재하기 때문에 오라클이 어느 컬럼인지 판단하지 못하여 오류를 발생시킨 것입니다.

이를 해결하려면 다음과 같이 명시적으로 테이블 별칭과 컬럼을 지정하면 됩니다.


SELECT c.id AS customer_id, c.name, o.order_date
FROM customers c
JOIN orders o ON c.id = o.customer_id;

5. 요약 정리

구분 오류 발생 상황 해결 방법
JOIN 사용 두 테이블에 같은 이름의 컬럼 존재 테이블 별칭과 컬럼명 명시
SELECT * 사용 중복 컬럼 포함되어 결과 모호 명시적으로 필요한 컬럼만 선택
VIEW 생성 중복된 컬럼명을 정의 각 컬럼에 별칭 지정

6. 예방을 위한 팁

  • 테이블 별칭은 습관적으로 사용하자. 짧고 명확한 별칭은 가독성을 높인다.
  • SELECT * 대신 명시적 컬럼 지정을 습관화하자.
  • JOIN 구문을 사용할 때는 항상 컬럼의 출처를 명확히 해야 한다.
  • VIEW 정의 시에도 반드시 컬럼 명칭을 검토하고 중복 여부를 체크하자.

7. 마무리

ORA-00918은 초보자뿐 아니라 경험자도 종종 마주치는 오류이지만, 그 원인은 단순하고 명확합니다. 이 오류를 자주 접하는 분들은 위에서 소개한 원인 분석과 해결책을 익혀 두면, SQL 작성 시 오류 없이 효율적인 코드를 구현할 수 있습니다.

명확한 컬럼 명시, 별칭 사용, 불필요한 SELECT * 배제는 코드 품질 향상과 더불어 디버깅 비용을 줄이는 데 중요한 습관입니다.

출처

728x90