본문 바로가기
DB/SQLPLUS

[ORACLE] MERGE(머지)

by KhyeonS 2022. 6. 20.

이번엔 머지에 대해서 알아 볼 것이다.


  MERGE(머지)
   MERGE는 하나 혹은 그 이상의 테이블에 대한 INSERT나 UPDATE 작업을 수행할 때 여러 명령어들을 묶어서 질의하게 해주는 기능이다. 이 명령어는 여러 개의 동작을 조합해서 실행하게 해주므로 쿼리 작업이 매우 편리하다. INSERT나 UPDATE에서 조건을 추가할 수도 있고 여러 행 삭제 DELETE도 한 번에 수행하게 해준다. 단일 테이블에 MERGE 문은 자주 사용하므로 잘 알아 두는 것이 좋다. 다른 테이블이 아니라 직접 내용을 넣는다면 USING 절에 dual 테이블을 사용한다. 

  예를 들어 ON 조건에 일치하면 UPDATE하고, 불일치하면 INSERT를 하는 쿼리문이라면 
'MERGE INTO 테이블_명 USING SELECT ~ ON 조건 
  WHEN MATCHED THEN UPDATE ~나 DELETE ~ 구문
  WHEN NOT MATCHED THEN
    INSERT 구문 
  WHERE ~ 조건'식으로 사용할 수 있다.   

  merge를 사용해서 사번 100번이 있으면 부서를 20으로 변경하고, 없으면 사번 101번 Neena 사용자를 20번 부서에 넣어보자.  
  MERGE INTO employees USING dual ON (employee_id = 100)
    WHEN MATCHED THEN
      UPDATE 
        SET deptment_id = 20
    WHEN NOT MATCHED THEN
      INSERT (employee_id, last_name, department_id) VALUES(101, 'Neena', 20); 해본다. ‘1행이 병합되었습니다’ 메시지가 나온다.


●예제

/* Sales 부서의 사원들에게 급여의 10%와 $100을 보너스로 주고, 그 외의 부서에 대해서는 급여의 10%만 보너스로 주되, 
   급여가 $8,000 이하의 직원에 대해서만 적용시키시오. */
create table bonuses(employee_id number, bonus number default 100);  

insert into bonuses(employee_id)
select employee_id from employees e JOIN departments d
                   ON d.department_id = e.department_id
where department_name = 'Sales';

commit; 

select * from bonuses;

merge into bonuses b using (select employee_id, salary, department_id from employees) e
      on (e.employee_id = b.employee_id)
when matched then
  update 
    set bonus = salary * 1.1
    delete where salary > 8000
when not matched then
  insert values (e.employee_id, salary * 0.1)
  where salary <= 8000; 

 

/*머지를 사용해서 사번 100번이 있으면 부서를 20으로 변경하고 없으면, 101번Neena 사용자를 20번 부서로 넣으시오.*/ 
select last_name, first_name from employees
where employee_id = 101;

merge into employees1 using dual on (employee_id=100)
when matched then update
set department_id =20
when not matched then
insert (employee_id, last_name, department_id) values(101, 'Neena', 20);

select * from employees1
where employee_id =100;

select * from employees1
where first_name = 'Neena';

/*  판매 부서의 사원들에게 급여의 10%와 $100을 보너스로 주고, 그외의 부서에 대해서는 급여의 10%만 보너스로 주되, 급여가 $ 8000이하의 직원에 대해서만 적용시키시오. */
create table bonuses(employee_id number, bonus number default 100); 
// 보너스 항목에 값을 안주면 디폴트 값이 100으로 준다
//hire_date default SYSDATE 

insert into bonuses(employee_id)
select employee_id from employees e JOIN departments d
             ON d.department_id = e.department_id
where department_name = 'Sales';

commit;*/

select * from bonuses;

merge into bonuses b using (select employee_id, salary, department_id from employees) e
       on (e.employee_id = b.employee_id)
when matched then 
update
 set bonus = salary * 1.1
 delete where salary > 8000
when not matched then
 insert values (e.employee_id, salary * 0.1)
 where salary <= 8000;

select b.employee_id, bonus, salary, department_id from 
bonuses b JOIN employees e
on e.employee_id =  b.employee_id;

'DB > SQLPLUS' 카테고리의 다른 글

[ORACLE] Cursor(커서)  (0) 2022.06.20
[ORACLE] data dictionary  (0) 2022.06.20
[ORACLE] Sysnonym(동의어)  (0) 2022.06.20
[ORACLE] ROLE(롤)  (0) 2022.06.20
[ORACLE] SEQUNCE(시퀀스)  (0) 2022.06.20

댓글