1HOON
논리적 코딩
1HOON
전체 방문자
오늘
어제
  • HOME (186)
    • ☕️ JAVA (28)
      • WhiteShip Java LIVE Study (6)
      • Effective JAVA (10)
    • 🔮 KOTLIN (4)
    • 🌱 SPRING (51)
      • 스프링 인 액션 (22)
      • JPA (18)
    • ☕️ JAVASCRIPT (6)
    • 📃 DATABASE (40)
      • ORACLE (37)
      • MSSQL (2)
    • 🐧 LINUX (4)
    • 🐳 DOCKER (5)
    • 🐙 KUBERNETES (4)
    • 🏗️ ARCHITECTURE (8)
    • 📦 ETC (26)
      • TOY PROJECT (5)
      • RECRUIT (1)
      • 그냥 쓰고 싶어서요 (14)
    • 🤿 DEEP DIVE (1)
    • 🚽 Deprecated (9)
      • PYTHON (3)
      • AWS (2)
      • HTTP 완벽가이드 (3)
      • WEB (1)

블로그 메뉴

  • 홈
  • 방명록
  • 관리

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
1HOON

논리적 코딩

[SQL] 다중 테이블 INSERT
📃 DATABASE/ORACLE

[SQL] 다중 테이블 INSERT

2018. 1. 16. 23:00

다중 테이블 INSERT

여러개의 테이블에 멀티 로우를 삽입할 때 사용한다.


구문

1
2
3
4
5
6
7
8
INSERT  ALL | FIRST
WHEN    조건1 THEN
        INTO [스키마].테이블명(컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...)
WHEN    조건2 THEN
        INTO [스키마].테이블명(컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...)
    ...
ELSE    INTO [스키마].테이블명(컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...)
SELECT 문;
Colored by Color Scripter
cs


ALL

디폴트 값. 이후 WHEN 조건절을 명시했을 때, 각 조건이 맞으면 INSERT를 모두 수행하라는 의미

FIRST

이후 WHEN 절 조건식에 따른 INSERT 문을 수행할 때, 서브 쿼리로 반환된 로우에 대해 조건이 참인 WHEN 절을 만나면 해당 INSERT문을 수행하고 나머지에 대해서는 조건 평가를 하지 않고 종료.

WHEN 조건 THEN ... ELSE

특정 조건에 따라 INSERT를 수행할 때 해당 조건을 명시

SELECT 문

다중 테이블 INSERT 구문에서는 반드시 서브쿼리가 동반되어야하며, 서브쿼리의 결과를 조건에 따라 평가해 데이터를 INSERT한다.


예제

1. 샘플 테이블을 만든다.

1
2
3
4
5
6
7
8
9
10
CREATE TABLE EX7_3
(   
    EMP_ID      NUMBER
    ,EMP_NAME   VARCHAR2(100)   
);
CREATE TABLE EX7_4
(
    EMP_ID      NUMBER
    ,EMP_NAME   VARCHAR2(100)
);
cs


2. 기존의 단일 테이블 INSERT 방법

1
2
INSERT INTO EX7_3 VALUES ( 101, '홍길동');
INSERT INTO EX7_3 VALUES ( 102, '김유신');
cs



3. 다중 테이블 INSERT

1
2
3
4
5
INSERT  ALL
INTO    EX7_3   VALUES (103, '강감찬')
INTO    EX7_3   VALUES (104, '연개소문')
SELECT  *
FROM    DUAL;
cs


1
2
3
4
5
INSERT  ALL
INTO    EX7_3   VALUES (105, '가나다')
INTO    EX7_4   VALUES (105, '마바사')
SELECT  *
FROM    DUAL;
cs


4. 테이블을 비운다.

1
2
TRUNCATE TABLE EX7_3;
TRUNCATE TABLE EX7_4;
cs


5. 심화

1
2
3
4
5
6
7
8
9
INSERT  ALL
    WHEN DEPARTMENT_ID = 30  THEN
         INTO EX7_3 VALUES (EMPLOYEE_ID, EMP_NAME)
    WHEN DEPARTMENT_ID = 90  THEN
         INTO EX7_4 VALUES (EMPLOYEE_ID, EMP_NAME)
SELECT  DEPARTMENT_ID
        , EMPLOYEE_ID
        , EMP_NAME
FROM    EMPLOYEES;
Colored by Color Scripter
cs


만약 FIRST를 명시했다면, 첫번째로 조건 값이 TRUE가 될 때 해당 로우가 입력되고 끝난다.

만약 그 다음 WHEN 조건 결과가 TRUE가 되더라도 이미 이전 단계에서 입력이 되었기 때문에, 그 로우는 추가로 입력되지 않는다.


6. 사번이 116번보다 작은 사원은 EX7_3에, 급여가 5000보다 작은 사원은 EX7_4에 넣는다.

1
2
3
4
5
6
7
8
9
10
11
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;
cs


SELECT 문으로 테이블을 확인해보면 아래와 같이 출력된다.


[EX7_3]


[EX7_4]


EMP_ID가 115인 Alexander Khoo를 둘 중 한 테이블에만 넣으려면?


7. FIRST를 이용한다.

1
2
3
4
5
6
7
8
9
10
11
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;
cs


[EX7_3]


[EX7_4]


FIRST 를 사용했기 때문에, 첫번째 WHEN 조건을 충족한 행은 두번째 WHEN 조건을 검사하지 않고 넘어간다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'📃 DATABASE > ORACLE' 카테고리의 다른 글

[PL/SQL] IF문 / CASE문  (1) 2018.01.21
[PL/SQL] PL/SQL 기초  (0) 2018.01.17
[SQL] WINDOW 함수  (0) 2018.01.16
[SQL] 분석 함수  (0) 2018.01.15
[SQL] WITH절과 순환 서브쿼리  (1) 2018.01.15
    '📃 DATABASE/ORACLE' 카테고리의 다른 글
    • [PL/SQL] IF문 / CASE문
    • [PL/SQL] PL/SQL 기초
    • [SQL] WINDOW 함수
    • [SQL] 분석 함수
    1HOON
    1HOON

    티스토리툴바