더북(TheBook)

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 문법을 사용해야 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.