더북(TheBook)

마지막으로 알아 볼 내용은 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 구문은 의외로 개발자들 사이에 그리 널리 알려져 있지 않아 잘 사용되는 편은 아니다. 하지만 가끔씩 요긴하게 써먹을 수 있는 유용한 구문이므로 기억해 두도록 하자.

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