마지막으로 알아 볼 내용은 INSERT ALL 대신 INSERT FIRST를 사용하는 형태다. ALL과 FIRST의 차이점은 입력되는 대상 로우를 기준으로 WHEN 조건에 맞으면 처리하는 방식에 있다. 만약 FIRST를 명시했다면 첫 번째로 조건 값이 TRUE가 될 때 해당 로우가 입력되고 끝난다. 만약 그 다음 WHEN 조건 결과가 TRUE가 되더라도 이미 이전 단계에서 입력이 됐으므로 그 로우는 추가로 입력되지 않는다. 예제를 통해 FIRST의 쓰임새를 알아보자. 다시 ex7_3, ex7_4, ex7_5 테이블을 비우고 사원 테이블에서 30번 부서에 속한 사원을 선택해 보자.

    입력

        SELECT department_id, employee_id, emp_name,  salary
          FROM employees
         WHERE department_id = 30;
    
    그림 7-34 30번 부서 사원 리스트

    이 중에서 사번이 116번 보다 작은 사원은 ex7_3 테이블에, 급여가 5000보다 작은 사원은 ex7_4 테이블에 넣으려면 다음과 같이 문장을 작성하면 된다.

    입력

        INSERT ALL
          WHEN employee_id < 116 THEN
            INTO ex7_3 VALUES (employee_id, emp_name)
          WHEN salary < 5000 THEN
            INTO ex7_4 VALUES (employee_id, emp_name)
        SELECT department_id, employee_id, emp_name,  salary
          FROM employees
         WHERE department_id = 30;
    

    결과

        7개 행 이(가) 삽입되었습니다.
    

    데이터가 어떻게 들어갔는지 두 테이블을 조회해 보자.

    입력

        SELECT *
          FROM ex7_3;
    

    결과

        EMP_ID  EMP_NAME
        ------- -----------------
            114 Den Raphaely
            115 Alexander Khoo
    

    입력

        SELECT *
          FROM ex7_4;
    

    결과

        EMP_ID  EMP_NAME
        ------ ----------------
           115 Alexander Khoo
           116 Shelli Baida
           117 Sigal Tobias
           118 Guy Himuro
           119 Karen Colmenares
    

    정상적으로 데이터가 입력되었는데 눈여겨 볼 부분은, 115번 Alexander는 사번이 116번 이하이므로 ex7_3 테이블에도 입력됐고 급여가 3100으로 5000보다 작아서 ex7_4 테이블에도 입력됐다는 점이다. 그런데 만약 INSERT ALL 대신 INSERT FIRST를 사용하면 어떻게 될까? ROLLBACK문을 실행해 테이블을 초기 상태로 되돌린 후 다음 문장을 실행해 보자.

    입력

        INSERT FIRST
          WHEN employee_id < 116 THEN
            INTO ex7_3 VALUES (employee_id, emp_name)
          WHEN  salary < 5000 THEN
            INTO ex7_4 VALUES (employee_id, emp_name)
        SELECT department_id, employee_id, emp_name,  salary
          FROM employees
         WHERE department_id = 30;
    

    결과

        6개 행 이(가) 삽입되었습니다.
    

    INSERT ALL은 총 입력된 로우가 7개였는데 FIRST를 사용하니 1개 줄었다. 어떻게 된 일일까? 앞에서도 설명했듯이 FIRST는 로우 기준으로 첫 번째 조건을 만족하면 그 다음 조건은 건너 뛰게 된다. 따라서 두 가지 조건에 모두 해당되는 115번인 Alexander는 FIRST를 사용하면 맨 처음 조건만 적용되어 ex7_3 테이블에는 들어가고 두 번째 조건은 적용되지 않아 ex7_4 테이블에는 입력되지 않는다. 두 테이블을 다시 조회해 보자.

    입력

        SELECT *
          FROM ex7_3;
    

    결과

        EMP_ID EMP_NAME
        ----------------------
        114    DenRaphaely
        115    Alexander Khoo
    

    입력

        SELECT *
          FROM ex7_4;
    

    결과

        EMP_ID EMP_NAME
        ------ --------------------------
        116    Shelli Baida
        117    Sigal Tobias
        118    Guy Himuro
        119    Karen Colmenares
    

    다중 테이블 INSERT 구문은 의외로 개발자들 사이에 그리 널리 알려져 있지 않아 잘 사용되는 편은 아니다. 하지만 가끔씩 요긴하게 써먹을 수 있는 유용한 구문이므로 기억해 두도록 하자.

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