본문 바로가기
ORACLE/SQL

[Oracle] Multiple INSERT ALL, FIRST 다중 행 삽입 차이 :: 마이자몽

by 마이자몽 🌻♚ 2020. 3. 27.

전체 INSERT & 조건부 INSERT

다중행 INSERT에서 ALL과 FIRST로 구분하기 전에 전체 INSERT와 조건부 INSERT로 구분할 수 있습니다. 말그대로 전체는 모든 행을 삽입하는 것이고, 조건부 INSERT는 조건에 따라 INSERT할 수 있는 기능입니다. Multiple Insert를 실습해보기 위해 Oracle HR 계정을 사용하겠습니다.

 

전체 INSERT ALL

임시 사원 테이블 생성

1
2
3
4
5
6
7
8
9
10
11
--현재 근무하는 사원 테이블
CREATE TABLE CURR_EMP
AS
SELECT
    EMPLOYEE_ID
    ,FIRST_NAME
    ,HIRE_DATE
    ,JOB_ID
    ,SALARY
FROM EMPLOYEES
WHERE 1=0;

Multiple Insert 작업을 진행할 테이블은 하나 생성하겠습니다.

이 테이블에는 05년 01월 01일 이후 입사자만 넣겠습니다.

 

INSERT ALL

1
2
3
4
5
6
7
8
9
10
11
12
13
--INSERT ALL
INSERT ALL
    INTO CURR_EMP VALUES(
        EMPLOYEE_ID
        ,FIRST_NAME
        ,HIRE_DATE
        ,JOB_ID
        ,SALARY
    )
    SELECT * FROM EMPLOYEES
    WHERE HIRE_DATE >= '05/01/01';
    
SELECT * FROM CURR_EMP;

 

 

조건부 INSERT

 ALL & FIRST 차이

ALL과 FIRST의 차이는 위 그림으로 표현하고 싶습니다. 프로그래밍을 해보신 분이라면 무슨 의미인지 바로 이해하셨을 거라고 생각합니다.

ALL은 WHEN THEN 구절의 조건을 모두 확인하고 해당되는 모든 조건에 INSERT 작업을 해줍니다. FIRST는 WHEN THEN 조건에서 처음 조건이 참에 부합했을때 해당 구절안으로 들어가 INSERT 작업을 해주고 끝까지 참인 조건이 없는 경우 ELSE 구절의 작업을 진행합니다.

 

이번에는 05년 01월 01일을 기준으로 이전에 입사한 사원들은 퇴사처리되도록 테이블을 하나 생성하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
--은퇴 사원
CREATE TABLE RETIRE_EMP
AS
SELECT
    EMPLOYEE_ID
    ,FIRST_NAME
    ,HIRE_DATE
    ,DEPARTMENT_ID
FROM EMPLOYEES
WHERE 1=0;
 
TRUNCATE TABLE CURR_EMP;

 

FIRST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--조건부 INSERT FIRST
INSERT FIRST
    WHEN HIRE_DATE >= '05/01/01' THEN
        INTO CURR_EMP VALUES(
            EMPLOYEE_ID
            ,FIRST_NAME
            ,HIRE_DATE
            ,JOB_ID
            ,SALARY
        )
    ELSE
        INTO RETIRE_EMP VALUES(
            EMPLOYEE_ID
            ,FIRST_NAME
            ,HIRE_DATE
            ,DEPARTMENT_ID
        )
 

 

ALL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--조건부 INSERT ALL
INSERT ALL
    WHEN HIRE_DATE >= '05/01/01' THEN
        INTO CURR_EMP VALUES(
            EMPLOYEE_ID
            ,FIRST_NAME
            ,HIRE_DATE
            ,JOB_ID
            ,SALARY
        )
    WHEN HIRE_DATE < '05/01/01' THEN
        INTO RETIRE_EMP VALUES(
            EMPLOYEE_ID
            ,FIRST_NAME
            ,HIRE_DATE
            ,DEPARTMENT_ID
        )
    SELECT * FROM EMPLOYEES;

 

ALL 방식으로 하게되면  모든 조건을 확인합니다.

 

태그

댓글0