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

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