MERGE
MERGE의 갱신, 입력과 조건부 삭제, 상관 서브쿼리 UPDATE 비교 및 SQLP 실습 과제
#핵심 요약
MERGE INTO 대상 USING 원천 ON (조건) WHEN MATCHED THEN UPDATE ... WHEN NOT MATCHED THEN INSERT...
조인이 너무 느리면 emp에 loc 컬럼을 추가하는 역정규화를 고려하고, 그 값을 MERGE로 채웠음
WHEN MATCHED THEN UPDATE ... DELETE WHERE 조건으로 갱신한 행 중 조건에 맞는 행을 지울 수 있음
이 조건은 갱신 전 값이 아니라 갱신된 값으로 평가함
ON 조건에 쓴 컬럼은 갱신할 수 없음
#개념과 동작 원리
MERGE는 하나 이상의 원천에서 행을 골라 대상 테이블이나 뷰에 갱신하거나 입력함
ON 조건이 참이면 갱신, 거짓이면 입력함
갱신 절의 WHERE는 조건이 참일 때만 갱신하며, 원천과 대상 테이블을 모두 참조할 수 있음
입력 절의 WHERE는 원천 컬럼만 참조할 수 있음
DELETE WHERE는 테이블을 채우거나 갱신하면서 정리할 때 씀
조건은 UPDATE SET ... WHERE가 평가한 원래 값이 아니라 갱신된 값으로 평가함
ON 조건에 나온 컬럼은 갱신할 수 없음
#필수 명령어 또는 SQL
#다른 테이블 값으로 갱신
ALTER TABLE emp ADD loc VARCHAR2(20);
MERGE INTO emp e
USING dept d
ON (e.deptno = d.deptno)
WHEN MATCHED THEN
UPDATE SET e.loc = d.loc;
ALTER TABLE emp ADD grade NUMBER(10);
MERGE INTO emp e
USING salgrade s
ON (e.sal BETWEEN s.losal AND s.hisal)
WHEN MATCHED THEN
UPDATE SET e.grade = s.grade;
MERGE INTO emp19 e
USING telecom_table t
ON (UPPER(e.telecom) = UPPER(t.telecom))
WHEN MATCHED THEN
UPDATE SET e.t_price = t.t_price;결과 해석: 첫 문장은 사원마다 부서 위치를, 두 번째는 월급 등급을, 세 번째는 통신사 요금을 채움
세 번째는 emp19의 통신사 표기가 섞여 있어 UPPER로 맞췄음
실습에서는 emp19에 t_price 컬럼을 먼저 추가했음
#MERGE 없이 같은 갱신
UPDATE emp e
SET loc = (SELECT loc FROM dept d WHERE d.deptno = e.deptno);결과 해석:
설명: 이 UPDATE는 emp 테이블의 건수만큼 갱신됨
14건이면 14번 갱신됨
상관 서브쿼리라 emp 행마다 서브쿼리가 평가됨(다중 컬럼과 상관 서브쿼리)
짝이 없는 행은 NULL로 갱신된다는 점이 MERGE ... WHEN MATCHED와 다름
#갱신, 입력, 삭제를 한 문장으로
문제: copy_dept를 dept 기준으로 맞추되, 둘 다 있는 부서번호는 갱신하고, copy_dept에 없으면 입력하고, loc가 'DALLAS'인 부서는 갱신 후 삭제하기
공식 문서 문법으로 쓰면 다음과 같음
MERGE INTO copy_dept c
USING dept d
ON (c.deptno = d.deptno)
WHEN MATCHED THEN
UPDATE SET c.dname = d.dname, c.loc = d.loc
DELETE WHERE c.loc = 'DALLAS'
WHEN NOT MATCHED THEN
INSERT (deptno, dname, loc)
VALUES (d.deptno, d.dname, d.loc);결과 해석: DELETE WHERE는 갱신된 값으로 평가하므로, 갱신 후 loc가 DALLAS가 된 행이 지워짐
실습의 SQLP 실기 과제(43회차 2번으로 소개): 본사 상품 마스터 기준으로 지점 동기화 테이블에 ① 있는 상품은 가격, 재고, 갱신일 갱신, ② 없는 신상품 입력, ③ ①에서 갱신된 행 중 재고 0은 삭제하는 세 문장을 MERGE 하나로 바꾸기
실습 채점 기준은 DELETE WHERE가 WHEN MATCHED 절 안에 있어야 한다는 것임
이는 공식 문서의 DELETE WHERE가 갱신된 행에만 적용되는 규칙과 맞음
실습의 다른 과제: 배송 기사 테이블의 담당 지역을 센터 테이블 기준으로 최신화하되 이미 같은 값이면 갱신하지 않기
갱신 절의 WHERE(예: WHERE d.region <> c.region)로 조건을 줄 수 있음
#사용 조건과 주의사항
ON 조건 컬럼은 갱신할 수 없음