ORA-25156: old style outer join (+) cannot be used with ANSI joins (ORA-25156: 이전 방식의 포괄 조인(+)은 ANSI 조인과 함께 사용할 수 없음)

ORA-25156: old style outer join (+) cannot be used with ANSI joins 오류는 한글로 "이전 방식의 포괄 조인(+)은 ANSI 조인과 함께 사용할 수 없음"이라고 표시합니다. 여기서 말하는 이전 방식은 오라클 조인을 뜻하며, 조인은 크게 오라클 조인과 ANSI 조인으로 나눌 수 있습니다.

오라클 조인, ANSI 조인

오라클 조인은 조인의 대상 테이블 중에, 값이 없어도 무관한 테이블에 플러스(+) 사인을 입력합니다. 다음과 같이 아우터 조인을 사용할 수 있으며, DEPT 테이블에 값이 없더라도 조회를 할 것입니다.

SELECT *
  FROM EMP, DEPT
 WHERE DEPT.DEPTNO(+) = EMP.DEPTNO;

오라클 조인의 특징은 조인 조건을 WHERE 절에 입력한다는 것입니다. 반면 ANSI(미국 국가표준 협회 : American National Standards Institute) 조인은 조건절을 ON으로 사용하며 다음과 같습니다.

ORA-25156: old style outer join (+) cannot be used with ANSI joins
SELECT *
  FROM EMP LEFT JOIN DEPT ON DEPT.DEPTNO = EMP.DEPTNO;

두 가지 조회 문장은 동일한 결과를 반환합니다. 오늘 다루어볼 ORA-25156: old style outer join (+) cannot be used with ANSI joins 오류는 두 가지 조인을 혼합하여 사용할 때에 발생합니다. 다음의 예제를 살펴보겠습니다.

ORA-25156: old style outer join (+) cannot be used with ANSI joins

SELECT *
       FROM    EMP
            LEFT JOIN
               DEPT
            ON DEPT.DEPTNO = EMP.DEPTNO,
            SALGRADE
      WHERE SAL(+) BETWEEN LOSAL AND HISAL;

ERROR at line 7:
ORA-25156: old style outer join (+) cannot be used with ANSI joins

ORA-25156 오류가 발생하는 이유는 EMP 테이블과 DEPT 테이블은 ANSI 아우터 조인을 하고, EMP 테이블과 SALGRADE 테이블을 조회할 때에는 오라클 조인을 시도하였기 때문입니다. 해당 오류를 해결하기 위해서는 일관성 있게 오라클 조인만을 사용하든지, 안시 조인을 사용하여야 합니다.

저는 이종 DBMS 간의 호환성이나 코드의 직관성 측면에서 ANSI조인을 권장하는 편입니다.

--ANSI 조인

SELECT *
  FROM EMP
       LEFT JOIN DEPT
          ON DEPT.DEPTNO = EMP.DEPTNO
       LEFT JOIN SALGRADE
          ON SAL BETWEEN LOSAL AND HISAL;

--오라클 조인

SELECT *
  FROM EMP, DEPT, SALGRADE
 WHERE DEPT.DEPTNO(+) = EMP.DEPTNO AND SAL(+) BETWEEN LOSAL AND HISAL;
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗