2026년 06월 23일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00964 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00964 table name not in FROM list 는?
ORA-00964 에러는 SQL 쿼리의 WHERE 절, SELECT 절, 또는 기타 절에서 참조한 테이블 이름이 FROM 절에 명시되지 않았을 때 발생하는 오류입니다. Oracle 데이터베이스는 쿼리에서 사용되는 모든 테이블 또는 뷰가 반드시 FROM 절에 선언되어 있어야 한다는 규칙을 엄격하게 적용하며, 이를 위반하면 파싱 단계에서 즉시 이 에러를 반환합니다. 주로 복잡한 조인 쿼리나 서브쿼리 작성 시 테이블 alias를 혼동하거나 FROM 절을 누락하는 실수에서 발생하며, 개발 초기뿐 아니라 베테랑 DBA도 간혹 마주치는 에러입니다.
주요 발생 원인
1. FROM 절에 없는 테이블을 WHERE 절 또는 SELECT 절에서 참조
가장 흔한 원인으로, 쿼리 작성 중 WHERE 절이나 SELECT 절에서 특정 테이블을 참조했지만 FROM 절에 해당 테이블을 추가하지 않은 경우입니다. 특히 여러 테이블을 조인하는 복잡한 쿼리를 작성하다 보면 실수로 테이블 하나를 FROM 절에서 빠뜨리는 경우가 발생합니다. 이 경우 Oracle은 어떤 데이터 소스를 기준으로 컬럼을 해석해야 할지 알 수 없어 즉시 에러를 반환합니다.
2. 서브쿼리(Subquery) 내부에서 외부 테이블을 잘못 참조
서브쿼리 내부에서 해당 서브쿼리의 FROM 절에 없는 외부 쿼리의 테이블을 잘못된 방식으로 참조할 때 발생합니다. 상관 서브쿼리(Correlated Subquery)를 작성할 때 alias 범위(scope)를 혼동하거나, 서브쿼리가 독립적으로 실행되어야 하는 상황에서 외부 테이블명을 직접 사용하는 실수를 저지르기 쉽습니다. Oracle은 서브쿼리의 스코프를 엄격하게 관리하기 때문에 이 경우 ORA-00964가 발생합니다.
3. 테이블 Alias 오타 또는 잘못된 Alias 사용
FROM 절에 테이블을 선언했지만 alias를 잘못 지정하거나, 다른 절에서 alias가 아닌 원래 테이블명(또는 반대로 정의하지 않은 alias)을 혼용하여 사용하는 경우입니다. 예를 들어 FROM 절에서 EMPLOYEES e로 선언했는데 WHERE 절에서 EMP.EMPLOYEE_ID와 같이 선언되지 않은 alias를 사용하면 Oracle은 EMP라는 테이블을 FROM 절에서 찾을 수 없어 에러를 발생시킵니다. 특히 레거시 코드를 수정하거나 다른 사람이 작성한 쿼리를 변경할 때 이런 실수가 자주 발생합니다.
해결 방법
원인 1 해결: FROM 절에 누락된 테이블 추가
아래는 에러가 발생하는 쿼리와 수정된 쿼리의 예시입니다.
-- ❌ 에러 발생: DEPARTMENTS 테이블이 FROM 절에 없음
SELECT e.employee_id,
e.first_name,
d.department_name
FROM employees e
WHERE d.department_id = e.department_id -- d는 FROM 절에 없음
AND e.salary > 5000;
-- ✅ 수정: DEPARTMENTS 테이블을 FROM 절에 추가하고 JOIN 처리
SELECT e.employee_id,
e.first_name,
d.department_name
FROM employees e
JOIN departments d ON d.department_id = e.department_id
WHERE e.salary > 5000;
원인 2 해결: 서브쿼리 내 테이블 참조 수정
-- ❌ 에러 발생: 서브쿼리 내부에서 외부 테이블을 잘못 참조
SELECT employee_id,
first_name,
salary
FROM employees
WHERE salary > (SELECT AVG(salary)
FROM employees
WHERE departments.location_id = 1700); -- departments가 서브쿼리 FROM에 없음
-- ✅ 수정 방법 1: 서브쿼리 FROM 절에 departments 추가
SELECT employee_id,
first_name,
salary
FROM employees
WHERE salary > (SELECT AVG(e2.salary)
FROM employees e2
JOIN departments d ON d.department_id = e2.department_id
WHERE d.location_id = 1700);
-- ✅ 수정 방법 2: 상관 서브쿼리(Correlated Subquery)로 올바르게 작성
SELECT e.employee_id,
e.first_name,
e.salary
FROM employees e
WHERE e.salary > (SELECT AVG(e2.salary)
FROM employees e2
JOIN departments d ON d.department_id = e2.department_id
WHERE d.location_id = 1700);
원인 3 해결: Alias 오타 및 혼용 수정
-- ❌ 에러 발생: FROM 절에는 'e'로 선언했으나 WHERE 절에서 'EMP' alias 사용
SELECT e.employee_id,
e.last_name,
e.department_id
FROM employees e
WHERE EMP.department_id = 10 -- 'EMP'는 FROM 절에 정의되지 않음
AND EMP.salary > 3000;
-- ✅ 수정: 일관되게 alias 'e' 사용
SELECT e.employee_id,
e.last_name,
e.department_id
FROM employees e
WHERE e.department_id = 10
AND e.salary > 3000;
-- ❌ 에러 발생: 복잡한 멀티 조인에서 alias 혼동
SELECT a.order_id,
b.product_name,
c.customer_name
FROM orders a
JOIN products b ON b.product_id = a.product_id
WHERE customers.customer_id = a.customer_id; -- customers alias 없이 원본 테이블명 사용
-- ✅ 수정: customers 테이블을 FROM/JOIN 절에 추가
SELECT a.order_id,
b.product_name,
c.customer_name
FROM orders a
JOIN products b ON b.product_id = a.product_id
JOIN customers c ON c.customer_id = a.customer_id;
추가 진단 팁
-- 쿼리 구조 확인을 위한 EXPLAIN PLAN 활용
EXPLAIN PLAN FOR
SELECT e.employee_id, d.department_name
FROM employees e
JOIN departments d ON d.department_id = e.department_id
WHERE e.salary > 5000;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
예방 방법
1. 쿼리 작성 시 FROM 절을 먼저 완성한 후 다른 절 작성하기
복잡한 쿼리를 작성할 때는 SELECT, WHERE, GROUP BY 등 다른 절보다 FROM 절을 먼저 완성하는 습관을 기르는 것이 중요합니다. FROM 절에 필요한 모든 테이블과 alias를 먼저 정의한 후, 그 alias를 기준으로 다른 절을 작성하면 ORA-00964와 같은 참조 오류를 사전에 방지할 수 있습니다. 또한 SQL 코드 리뷰 시 FROM 절과 다른 절에서 사용하는 테이블/alias 목록을 대조하는 체크리스트를 도입하면 팀 전체의 코드 품질을 높일 수 있습니다.
2. SQL 포맷터 및 정적 분석 도구 도입
SQL Developer, Toad, DBeaver 등 IDE의 문법 강조(Syntax Highlighting) 및 SQL Lint 기능을 활용하면 쿼리 실행 전에 FROM 절 누락 여부를 시각적으로 확인할 수 있습니다. 또한 PL/SQL 코드 내에서 동적 SQL을 사용하는 경우, 단위 테스트(Unit Test) 환경에서 모든 쿼리를 사전 검증하는 프로세스를 CI/CD 파이프라인에 통합하면 프로덕션 배포 전에 이러한 문법 오류를 조기에 차단할 수 있습니다.
관련 에러
- ORA-00904 (
invalid identifier): 컬럼명이나 alias가 잘못 지정된 경우 발생하며, ORA-00964와 함께 자주 등장하는 에러입니다. FROM 절 누락으로 인해 컬럼을 인식하지 못할 때 연쇄적으로 발생하기도 합니다. - ORA-00942 (
table or view does not exist): 참조한 테이블 자체가 데이터베이스에 존재하지 않거나 현재 사용자에게 접근 권한이 없을 때 발생합니다. ORA-00964와 혼동하기 쉬우나, ORA-00942는 테이블 존재 여부와 권한의 문제이고 ORA-00964는 SQL 구문상 FROM 절 누락의 문제입니다. - ORA-00918 (
column ambiguously defined): 동일한 컬럼명이 여러 테이블에 존재하는데 alias 없이 사용할 때 발생하며, 멀티 테이블 조인 쿼리에서 ORA-00964와 함께 자주 발생하는 관련 에러입니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.