[Oracle] 오라클 SELECT 해서 INSERT 하는 방법 (여러개, 서브쿼리)

오라클에서 쿼리문을 작성할 때 SELECT INSERT를 사용해야 할 경우가 많다. 기본 자료를 조회 후 전달받은 인자 값과 결합하여 INSERT 하거나, 이력 데이터를 저장할 때 자주 사용한다. SELECT INSERT의 경우 한 번의 호출로 여러 행을 입력할 수 있어서 다양하게 활용이 가능하다.

 

SELECT 절의 컬럼과 INSERT 테이블의 칼럼이 일치하는 경우

INSERT INTO emp 
SELECT 8000
     , 'GENT'
     , a.job
     , a.mgr
     , TO_DATE('2021-05-03', 'YYYY-MM-DD')
     , a.sal
     , a.comm
     , a.deptno
  FROM emp a
 WHERE empno = 7698

 

 

SELECT 절의 컬럼 개수와 형식이 emp 테이블과 일치할 경우, emp 테이블의 컬럼을 선언하지 않고 INSERT가 가능하다.

 

SELECT 절의 컬럼과 INSERT 테이블의 컬럼이 불일치하는 경우

INSERT INTO emp (empno, ename, job, mgr, hiredate)
SELECT 8001
     , 'GENT'
     , a.job
     , a.mgr
     , TO_DATE('2021-05-03', 'YYYY-MM-DD')
  FROM emp a
 WHERE empno = 7698

 

 

SELECT 절의 컬럼과 emp 테이블의 컬럼이 일치하지 않을 경우, emp 테이블의 컬럼을 선언해야 한다.

 

MAX 순번을 채번 후 INSERT 하는 방법

INSERT INTO emp 
SELECT (SELECT MAX(empno) + 1 FROM emp)
     , 'GENT'
     , a.job
     , a.mgr
     , TO_DATE('2021-05-03', 'YYYY-MM-DD')
     , a.sal
     , a.comm
     , a.deptno
  FROM emp a
 WHERE empno = 7698

 

 

SELECT 절에서 서브 쿼리를 사용하여 MAX 순번을 채번 하면서 INSERT를 할 수 있다. PK 컬럼이 순번인 경우 활용이 가능한 방법이다.

 

SELECT 결과의 조건에 따라서 서로 다른 테이블에 INSERT 하는 방법

INSERT ALL
 WHEN job = 'MANAGER' THEN
      INTO emp_man (empno, deptno, sal, comm)
      VALUES(empno, deptno, sal, comm)
 WHEN job = 'SALESMAN' THEN
      INTO emp_sal (empno, deptno, sal, comm)
      VALUES(empno, deptno, sal, comm)
 ELSE
      INTO emp_etc (empno, deptno, sal, comm)
      VALUES(empno, deptno, sal, comm)
SELECT empno, job, deptno, sal, comm
  FROM emp

 

 

SELECT 결과에 따라서 서로 다른 테이블에 INSERT해야하는 경우 INSERT ALL을 사용하면 하나의 쿼리문으로 작업이 가능하다.

 

 

댓글

Designed by JB FACTORY