SQL Cook: 4. 11 레코드 병합하기

0

SQL_COOK

목록 보기
31/35
post-thumbnail

해당하는 레코드가 있는지 여부에 따라, 조건부로 테이블의 레코드를 삽입 • 업데이트 또는 삭제할 수 있다.

  • 레코드가
    • 있다: UPDATE
    • 없다: INSERT
      • 업데이트 후 레코드가 특정 조건을 만족하지 못한다: DELETE

문제:
EMP_COMMOCMITION 테이블을 다음과 같이 수정하려고 한다

  • EMP_COMMISSION의 사원이 EMP 테이블에 존재할 떄, 해당 사원의 커미션(COMM)을 1,000으로 업데이트한다
  • COMM을 1,000으로 업데이트할 가능성이 있는 모든 사원에 대해, SAL이 2,000 미만이면 해당 사원을 삭제한다(단, EMP_COMMISSION에 존재하지 않아야 한다)
  • 만약 그렇지 않다면, EMP 테이블의 EMPNO, ENAME, DEPTNO 값을 EMP_COMMOCMITION 테이블에 삽입한다

생각한 해법

  1. 특정 조건일 때 UPDATE 실행
  2. 특정 조건을 만족하는 레코드에 대해, 다시 한 번 다른 조건을 만족하는지 여부 검사
  3. 이 떄, 다른 조건을 만족하지 못하며, 특정 테이블에 존재하지 않는 레코드라면 DELETE 실행
  4. 1번 조건을 만족하지 않으면 특정 레코드를 목표 테이블에 INSERT

기본적으로, EMP_COMMISSION의 사원이 EMP 테이블에 존재하는지 여부를 검사하는 것이 첫 번째 조건이 되겠다.


테이블 생성 및 레코드 입력 / 확인

/* Oracle */
create table emp_commission(
deptno number,
empno number,
ename varchar(20),
comm number
);

insert into emp_commission (deptno, empno, ename)
values  (10, 7782, 'CLARK');

insert into emp_commission (deptno, empno, ename)
values (10, 7839, 'KING');

insert into emp_commission (deptno, empno, ename)
values  (10, 7934, 'MILLER');

select * from emp_commission;
>>

DEPTNO	EMPNO	ENAME	COMM
10		7839	KING	 - 
10		7934	MILLER	 - 
10		7782	CLARK	 - 
3 rows selected.

해법:
MERGE문을 사용한다

필요할 때 UPDATE 또는 INSERT를 수행할 수 있다.
사용 방법은 아래와 같다.

/* Oracle */
merge into emp_commission ec
using (select * from emp) emp
	on (ec.empno = emp.empno)
    when matched then
    	update set ec.comm = 1000
        delete where (sal < 2000)
    when not matched then
    	insert (ec.empno, ec.ename, ec.deptno, ec.comm)
        values (emp.empno, emp.ename, emp.deptno, emp.comm)

해설

Oracle에서 쿼리를 작성하다보면, 하나의 쿼리로 INSERT, UPDATE, DELETE 작업을 해야 하는 경우가 있다.

merge into tb_A /* tb_A 테이블에 */
	using tb_B /* 아래 조건을 만족하는 tb_B 테이블의 특정 레코드가 존재한다면 */
    on tb_A.record = tb_B.record /* 조건 */
    when matched then /* 존재한다 */
    	update set ?.record = target /* 원하는 UPDATE문 실행 */
        delete where ?.record 		 /* 원하는 DELETE문 실행 */
    when not matched then /* 존재하지 않는다 */
    	insert (cols ...)			 /* 원하는 INSERT문 실행 */
        values (values...)

이런 식으로 사용한다.
조건 만족 불만족에 따라 원하는 CUD 작업을 수행할 수 있게 해준다.
MARIA(MySQL)에서는 MERGE를 지원하지 않는다.


정리

빌트인 중심의 풀이가 나왔다.
MARIA에서 안 되는 것이 생각보다 많다 할 수 있지만, 단일 쿼리가 아니라면 MARIA로도 충분히 해결이 가능하다.
... 단일 쿼리라도 길게 쓴다면 해법이 있을 수 있겠다.
Oracle에서는 함수 중심의 해법이 강한 것 같다.

-> 해법 생각해보기

0개의 댓글