2026년 07월 26일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01719 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01719 outer join operator (+) not allowed in operand of OR or IN 는?
ORA-01719 에러는 Oracle의 전통적인 외부 조인 연산자 (+)를 OR 또는 IN 조건의 피연산자(operand)로 사용할 때 발생하는 오류입니다. Oracle은 (+) 연산자를 통한 외부 조인(Outer Join)을 지원하지만, 이를 OR이나 IN 절과 함께 혼합하여 사용하는 것은 SQL 문법적으로 허용하지 않습니다. 실무에서는 레거시 코드를 유지보수하거나 복잡한 조건절을 작성할 때 자주 접하게 되는 에러이며, ANSI 표준 조인 문법으로 전환하거나 쿼리 구조를 변경함으로써 해결할 수 있습니다.
주요 발생 원인
1. OR 조건과 (+) 외부 조인 연산자의 혼용
가장 빈번하게 발생하는 원인으로, WHERE 절에서 (+) 외부 조인 조건을 OR 연산자와 함께 사용하는 경우입니다. 예를 들어, 두 테이블을 외부 조인하면서 OR로 여러 조건을 묶으려 할 때 Oracle 파서(Parser)가 이를 허용하지 않아 에러가 발생합니다. 이는 Oracle 내부적으로 (+) 연산자를 처리하는 방식이 OR 분기 로직과 충돌하기 때문입니다.
-- 에러 발생 예시
SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+)
OR e.location_id = d.location_id(+); -- ORA-01719 발생!
2. IN 절 내부에서의 (+) 연산자 사용
IN 조건 내에서 외부 조인 연산자 (+)를 사용하려는 경우에도 동일한 에러가 발생합니다. 예를 들어, 서브쿼리가 아닌 리터럴 목록과 함께 IN을 사용하면서 조인 조건에 (+)를 붙이는 패턴이 대표적입니다. Oracle은 IN 절이 내부적으로 다수의 OR 조건으로 변환되는 방식 때문에, (+) 연산자와 동시에 사용하는 것을 허용하지 않습니다.
-- 에러 발생 예시
SELECT e.employee_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) IN (10, 20, 30); -- ORA-01719 발생!
3. 복합 WHERE 절에서의 의도치 않은 혼용
복잡한 쿼리를 작성하거나 기존 쿼리에 조건을 추가하는 과정에서, 개발자가 의도치 않게 (+) 조건이 포함된 WHERE 절에 OR을 추가하는 경우입니다. 특히 여러 명이 동시에 개발하는 프로젝트에서 레거시 쿼리를 수정할 때 발생 빈도가 높습니다. 코드 리뷰 없이 조건이 추가되면 테스트 단계에서야 발견되는 경우가 많아 개발 일정에 영향을 줄 수 있습니다.
-- 에러 발생 예시: 기존 쿼리에 OR 조건 추가
SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+)
AND e.status = 'ACTIVE'
OR d.dept_code = 'HQ'; -- ORA-01719 발생!
해결 방법
해결 방법 1: ANSI 표준 LEFT OUTER JOIN 문법으로 전환 (OR 조건 문제 해결)
가장 권장되는 방법은 Oracle 전용 (+) 문법을 ANSI 표준 LEFT OUTER JOIN 또는 FULL OUTER JOIN으로 변경하는 것입니다. ANSI 조인 문법은 OR 조건과 함께 자유롭게 사용할 수 있으며, 가독성도 훨씬 뛰어납니다.
-- 해결 방법: ANSI LEFT OUTER JOIN 사용
SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id
OR e.location_id = d.location_id);
-- 또는 FULL OUTER JOIN이 필요한 경우
SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON e.department_id = d.department_id
WHERE e.status = 'ACTIVE'
OR d.dept_code = 'HQ';
해결 방법 2: IN 절 문제를 ANSI JOIN + IN 조합으로 해결
IN 절과 외부 조인을 함께 사용해야 하는 경우, ANSI 조인 문법으로 전환한 뒤 WHERE 절에서 IN을 별도로 처리합니다.
-- 에러 발생 코드 (기존)
SELECT e.employee_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) IN (10, 20, 30);
-- 해결 방법: ANSI JOIN으로 전환 후 WHERE에서 IN 처리
SELECT e.employee_id, d.department_name
FROM departments d
LEFT OUTER JOIN employees e
ON e.department_id = d.department_id
WHERE d.department_id IN (10, 20, 30);
해결 방법 3: UNION ALL을 활용한 OR 조건 분리
ANSI 조인 문법으로 전환이 어려운 레거시 환경에서는, OR 조건을 UNION ALL로 분리하여 각각의 쿼리에서 (+) 연산자를 독립적으로 사용하는 방법을 사용할 수 있습니다.
-- OR 조건을 UNION ALL로 분리
SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+)
UNION ALL
SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e, departments d
WHERE e.location_id = d.location_id(+)
AND NOT EXISTS (
SELECT 1
FROM departments d2
WHERE e.department_id = d2.department_id
);
해결 방법 4: 서브쿼리 또는 CTE(Common Table Expression) 활용
복잡한 외부 조인 로직은 CTE를 활용하여 단계적으로 분리하면 가독성과 유지보수성이 높아지고 에러도 방지할 수 있습니다.
-- CTE를 활용한 단계적 처리
WITH dept_info AS (
SELECT department_id, department_name, location_id, dept_code
FROM departments
WHERE dept_code = 'HQ'
OR department_id IN (10, 20, 30)
),
emp_dept AS (
SELECT e.employee_id
, e.employee_name
, e.department_id
, d.department_name
FROM employees e
LEFT OUTER JOIN dept_info d
ON e.department_id = d.department_id
)
SELECT employee_id, employee_name, department_name
FROM emp_dept
WHERE department_name IS NOT NULL
OR employee_id < 100;
예방 방법
1. 신규 개발 시 ANSI 표준 JOIN 문법 전면 도입
팀 내 SQL 코딩 표준을 수립할 때 Oracle 전용 (+) 외부 조인 문법 사용을 금지하고, ANSI 표준인 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN 문법만을 사용하도록 가이드라인을 정의해야 합니다. 이를 통해 ORA-01719뿐만 아니라 Oracle 전용 문법으로 인한 다른 호환성 문제도 미연에 방지할 수 있으며, 타 DBMS로의 마이그레이션 시에도 SQL 재작업을 최소화할 수 있습니다. CI/CD 파이프라인에 SQL 린터(Linter) 도구를 통합하여 (+) 문법 사용 시 자동으로 경고를 발생시키는 것도 좋은 방법입니다.
2. 레거시 쿼리 수정 시 전체 WHERE 절 검토 및 테스트 강화
기존 레거시 쿼리에 새로운 조건을 추가할 때는 반드시 WHERE 절 전체를 검토하여 (+) 연산자가 포함되어 있는지 확인하는 절차를 의무화해야 합니다. 단위 테스트(Unit Test)와 통합 테스트(Integration Test) 단계에서 다양한 조건 조합으로 쿼리를 검증하고, 코드 리뷰 체크리스트에 외부 조인 문법 확인 항목을 포함시키는 것이 효과적입니다. 특히 ORM(Object-Relational Mapping) 프레임워크에서 네이티브 쿼리(Native Query)를 작성할 때도 동일한 기준을 적용해야 합니다.
관련 에러
- ORA-01720:
GRANT옵션이 없는 상황에서의 외부 조인 관련 권한 에러로, 외부 조인 쿼리 작성 시 함께 검토해야 합니다. - ORA-01417: 테이블이 두 개 이상의 다른 테이블과 동시에 외부 조인될 수 없음을 나타내는 에러입니다.
(+)문법 사용 시 한 테이블에 여러 외부 조인을 설정하려 할 때 발생하며, ORA-01719와 함께 자주 마주치는 에러입니다. - ORA-01416: 두 테이블이 서로 외부 조인될 수 없음을 나타내며, 순환 외부 조인 시도 시 발생합니다.
- ORA-00905:
MISSING KEYWORD에러로, 외부 조인 문법을 잘못 작성했을 때 ORA-01719 이전에 먼저 발생할 수 있는 구문 에러입니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.