FULL OUTER 조인
FULL OUTER 조인은 외부 조인의 하나로 ANIS 조인에서만 제공하는 기능이다. 즉 기존 문법으로는 사용할 수 없다. 지금까지 알아 본 외부 조인은 두 테이블 중 어느 한 테이블에 조인 조건에 만족하는 데이터가 없더라도 조회되는, 즉 한쪽 이빨이 빠진 형태로 데이터가 조회되었다. 그런데 한쪽 테이블이 아닌 두 테이블 모두 이 빠진 형태로 데이터를 조회해야 한다면 어떻게 해야 할까?
다음과 같이 테이블 2개를 생성하고 데이터를 넣어 보자.
입력
CREATE TABLE HONG_A (EMP_ID INT);
CREATE TABLE HONG_B (EMP_ID INT);
INSERT INTO HONG_A VALUES ( 10);
INSERT INTO HONG_A VALUES ( 20);
INSERT INTO HONG_A VALUES ( 40);
INSERT INTO HONG_B VALUES ( 10);
INSERT INTO HONG_B VALUES ( 20);
INSERT INTO HONG_B VALUES ( 30);
COMMIT;
두 테이블에 들어있는 데이터는 다음과 같다.
HONG_A | HONG_B | |
10 | 10 | |
20 | 20 | |
40 | 30 |
30은 B 테이블에만 있고, 40은 A 테이블에만 있다. 그런데 아래와 같이 조회해야 한다면?
EMP_ID_A | EMP_ID_B |
10 | 10 |
20 | 20 |
30 | |
40 |
외부 조인을 해야 하는데, 지금까지 배운 내용으로는 한 문장으로 처리할 수 없다(이전 장에서 배우는 집합 연산자를 사용하면 가능하다). 외부 조인을 할 때, A 테이블을 기준으로 하면 30이, B 테이블을 기준으로 하면 40이 빠진다. 그렇다고 해서 다음과 같이 하면 오류가 발생한다.
입력
SELECT a.emp_id, b.emp_id
FROM hong_a a,
hong_b b
WHERE a.emp_id(+) = b.emp_id(+);
결과
SQL 오류: ORA-01468: outer-join된 테이블은 1개만 지정할 수 있습니다.
즉 외부 조인 조건에서는 한 쪽에만 (+)를 붙일 수 있다. 그렇다면 어떻게 해야 할까? 바로 이럴 때 FULL OUTER 조인을 사용한다. ‘FULL’이란 말 그대로 두 테이블 모두를 외부 조인 대상에 넣을 수 있다.
입력
SELECT a.emp_id, b.emp_id
FROM hong_a a
FULL OUTER JOIN hong_b b
ON ( a.emp_id = b.emp_id);
결과
EMP_ID EMP_ID
---------- ----------
10 10
20 20
30
40
4개의 행이 선택됨.
정리해 보면, 모든 조인은 기존 오라클 문법과 ANSI 문법을 사용해 모두 구현할 수 있으며, FULL OUTER JOIN은 ANSI 문법을 사용해야 한다.