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