oracle SQL - 다중 INSERT
INSERT INTO table [(column, column...)]
VALUES(data, data, data...);
VALUES 절을 사용한 INSERT
다중행 INSERT
1. 기존 테이블에서 선택한 행을 대상 테이블의 행으로 추가
2. 한 번에 여러 행을 여러 테이블에 INSERT 할 수 있습니다.
INSERT INTO emp300 (emp_id, emp_name, salary)
SELECT emp_id, emp_name, salary, dept_id
FROM y_emp
WHERE dept_id = 200;
y_emp 테이블에 부서 번호가 200번인 사원의 행에 emp_id, emp_name, salary 열을 emp300 테이블에 삽입합니다.
다중 테이블 INSERT
유형
- 무조건 INSERT
- 조건 ALL INSERT
- 조건 FIRST INSERT
- 피봇 INSERT
1. 무조건 INSERT
1) ALL 키워드 뒤에 여러 개의 INTO 절을 지정하여 다중 테이블 삽입
2) SELECT문에서 검색된 행은 아무런 제한 없이 지정된 모든 테이블에 INSERT
INSERT ALL
INTO sal_list VALUES(emp_id, salary, position)
INTO mgr_list VALUES(emp_id, mgr_id, hiredate)
SELECT emp_id, salary, position, mgr_id, hiredate
FROM y_emp
WHERE emp_id > 2000;
sal_list 테이블에 y_emp 테이블에 emp_id가 2000보다 큰 사원의 emp_id, salary, position을 삽입합니다.
mgr_list 테이블에 y_emp 테이블에 emp_id가 2000보다 큰 사원의 emp_id, mgr_id, hiredate를 삽입합니다.
2. 조건 INSERT (ALL, FIRST)
1) INTO절 앞의 WHEN 조건에 따라 다중 테이블 INSERT를 수행합니다.
2) ELSE 절은 선택적으로 사용할 수 있습니다.
- 지정한 경우 조건이 모두 거짓이면 ELSE 절에 지정한 테이블에 삽입합니다.
- 지정하지 않은 경우 조건이 모두 거짓이면 아무 작업도 수행하지 않습니다.
2_1. 조건 ALL INSERT
1) WHEN 절의 조건을 만족하는 모든 테이블에 대해 INSERT합니다.
INSERT ALL
WHEN salary > 300 THEN
INTO sal_list VALUES(emp_id, salary, position)
WHEN position ^= '대리' THEN
INTO mgr_list VALUES(emp_id, mgr_id, hiredate)
SELECT emp_id, salary, position, mgr_id, hiredate
FROM y_emp
WHERE emp_id > 1080;
y_emp 테이블에서 emp_id가 1080보다 큰 사원 중
급여가 300보다 높으면 sal_list 테이블에 emp_id, salary, position 열을 삽입하고
직급이 대리가 아니면 mgr_list 테이블에 emp_id, mgr_id, hiredate 열을 삽입합니다.
(if if 문..)
2_2. 조건 FIRST INSERT
1) 첫 번째 WHEN절에 만족한 경우 더 이상 그 아래 WHEN 조건은 보지않습니다.
2) 첫 번째 WHEN절을 만족하지 않으면 나머지는 조건 ALL INSERT와 동일하게 처리합니다.
INSERT FIRST
WHEN sal > 5000 THEN
INTO high_income VALUES(deptid, sal)
WHEN hiredate like '17%' THEN
INTO hired_list17 VALUES(deptid, hiredate)
WHEN hiredate like '18%' THEN
INTO hired_list18 VALUES(deptid, hiredate)
ELSE
INTO hired_list VALUES(deptid, hiredate)
SELECT dept_id, SUM(salary) sal, MAX(hiredate) hiredate
FROM y_emp
GROUP BY dept_id;
high_income 테이블에는 부서별 급여 총합이 5000보다 큰 부서의 아이디와 총 급여가 삽입됩니다.
hired_list17 테이블에는 부서 총 급여가 5000이하면서 해당 부서에 사원의 가장 최근 입사일이 17년도인 경우 부서 아이디와 총 급여가 삽입됩니다.
hired_list18 테이블도 부서에 최근 입사일이 18년도인 경우를 제외한 나머지 조건은 hired_list17 테이블 조건과 동일합니다.
총 급여가 5000이하면서 최근 입사일이 17년도도 아니고 18년도도 아니면 hired_list 테이블에 삽입합니다.
3. 피봇 INSERT
1) 정규화가 잘못된 테이블에 필요한 작업입니다.
위 테이블 경우 특정 사원의 올해 영업 실적을 확인할 경우 SUM() 함수로 요일별 합계를 구한 후 수작업으로 일일이 구해주어야 합니다.
INSERT ALL
INTO sales_report VALUES (emp_id, week_id, mon_sales)
INTO sales_report VALUES (emp_id, week_id, tue_sales)
INTO sales_report VALUES (emp_id, week_id, wed_sales)
INTO sales_report VALUES (emp_id, week_id, thur_sales)
INTO sales_report VALUES (emp_id, week_id, fr_sales)
SELECT emp_id, week_id, mon_sales, tue_sales, wed_sales, thur_sales, fr_sales
FROM sales_data;
피봇 INSERT한 결과입니다.