Oracle SQL을 사용하다 보면 외부 조인(outer join)을 구현할 때 종종 혼란스러운 오류를 마주하게 됩니다. 특히 다음과 같은 구문에서 문제가 발생하곤 하죠.
SELECT *
FROM (
SELECT * FROM table1
) A, (
SELECT * FROM table2
) B
WHERE A.id(+) = B.id(+);
처음 보는 분들은 이 쿼리가 정상적으로 실행될 것으로 기대할 수 있지만, 실제로는 오라클 SQL 문법 오류가 발생합니다. 이 글에서는 위 쿼리에서 무엇이 잘못되었는지, 오라클 외부 조인 사용 시의 주의사항, 그리고 문제를 해결하는 방법까지 자세히 설명합니다.
외부 조인(Outer Join)이란?
조인은 데이터베이스에서 두 개 이상의 테이블을 연결하여 데이터를 추출할 때 사용하는 기능입니다. 특히 외부 조인(outer join)은 한 테이블에만 존재하는 데이터도 결과에 포함시키는 데 사용됩니다.
오라클에서는 두 가지 외부 조인 방식이 존재합니다:
- 기존 오라클 문법 ((+) 사용)
- ANSI 표준 문법 (LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN)
문제의 쿼리 구문 분석
다시 한 번 문제의 SQL 문을 살펴보겠습니다.
SELECT *
FROM (
SELECT * FROM table1
) A, (
SELECT * FROM table2
) B
WHERE A.id(+) = B.id(+);
이 구문은 두 개의 서브쿼리 A, B를 조인한 후 외부 조인을 시도하고 있습니다. 하지만 핵심 문제는 WHERE 절에서 A.id(+) = B.id(+)로 양쪽에 동시에 (+) 연산자를 사용했다는 것입니다.
왜 A.id(+) = B.id(+)는 오류가 날까?
오라클 SQL에서 (+) 연산자는 외부 조인 대상 테이블에만 사용할 수 있습니다. 다시 말해, 누락 가능성이 있는 테이블(즉, 기준이 아닌 테이블)에만 (+)를 붙여야 합니다.
예:
- A.id(+) = B.id: B를 기준으로 한 외부 조인 → A에 없는 값도 포함
- A.id = B.id(+): A를 기준으로 한 외부 조인 → B에 없는 값도 포함
- A.id(+) = B.id(+): ❌ 문법 오류 – 오라클에서는 지원하지 않음
이 오류는 "ORA-01468: a predicate may reference only one outer-joined table"과 같은 메시지를 발생시키며, 쿼리가 실행되지 않습니다.
해결 방법
원하는 결과에 따라 다음과 같은 방식으로 쿼리를 수정할 수 있습니다.
1. Left Outer Join
table1을 기준으로 table2와 매칭되는 데이터가 있을 경우만 결과에 포함시키고, 없으면 NULL을 출력하고 싶다면:
SELECT *
FROM (
SELECT * FROM table1
) A,
(
SELECT * FROM table2
) B
WHERE A.id = B.id(+);
2. Right Outer Join
table2를 기준으로 하고 싶다면:
SELECT *
FROM (
SELECT * FROM table1
) A,
(
SELECT * FROM table2
) B
WHERE A.id(+) = B.id;
3. Full Outer Join (권장: ANSI 문법 사용)
양쪽 테이블 모두 기준으로 포함하고 싶다면, ANSI SQL 표준 문법을 사용해야 합니다. 이 방식은 가독성이 좋고, 유지보수에도 유리합니다.
SELECT *
FROM table1 A
FULL OUTER JOIN table2 B
ON A.id = B.id;
오라클 SQL에서 (+) 문법을 사용할 때 주의할 점
- (+)는 반드시 한쪽에만 사용해야 하며, 양쪽에는 절대 사용할 수 없습니다.
- FULL OUTER JOIN은 (+) 문법으로는 구현이 불가능합니다. ANSI 조인 방식 사용이 필수입니다.
- 서브쿼리를 사용한 경우에도 위의 원칙은 동일하게 적용됩니다.
Oracle SQL에서 외부 조인을 구현할 때 (+) 연산자는 유용하지만, 잘못 사용할 경우 오히려 오류를 발생시킬 수 있습니다. 특히 A.id(+) = B.id(+)처럼 양쪽에 동시에 (+)를 사용하는 건 오라클 SQL 문법상 허용되지 않습니다.
올바르게 외부 조인을 사용하기 위해선 다음 세 가지를 기억하세요:
- (+)는 항상 한쪽에만 쓸 것
- 가독성과 확장성을 고려해 ANSI JOIN 문법을 사용하는 것이 좋음
- 의도한 결과에 따라 LEFT, RIGHT, FULL OUTER JOIN을 적절히 선택할 것
오라클 SQL을 처음 접하는 초보자라면 이 같은 실수는 누구나 할 수 있습니다. 하지만 문제의 원인을 알고 나면 앞으로 더 견고하고 오류 없는 SQL 쿼리를 작성할 수 있게 될 것입니다.
'스마트웹앱콘텐츠전문가 > Oracle' 카테고리의 다른 글
CTE로 SQL 쿼리 간결하게 작성하기 – 성능 최적화와 재귀 쿼리 활용법 (0) | 2025.05.07 |
---|---|
오라클 타임스탬프 포맷 완벽 가이드 (0) | 2025.03.24 |
오라클에서 날짜와 시간 데이터를 저장하는 최적의 방법 (0) | 2025.03.24 |
오라클에서 컬럼 추가하는 방법과 주의사항 (0) | 2025.03.24 |
SQL JOIN 완벽 가이드: 다양한 JOIN 종류와 사용법 (0) | 2025.02.27 |