MERGE문 관련

1 분 소요

MERGE문 요약

  • 테이블에 이미 데이터가 존재하면 UPDATE / DELETE, 없으면 INSERT하는 용도.
    • 변결할 테이블(1), 변경할 기준을 가진 테이블(1) 2개를 사용한다! (변경기준이 될 테이블이 없으면 USING 뒤에 ‘ DUAL ‘ 사용)
  • ON 뒤에 테이블 비교값은 반드시 PK(주키)값을 사용해야한다.
  • 주요 키워드
MERGE INTO [변경될 테이블명] A
USING [변경기준이 되는 테이블명] B
ON (A.key = B.key)
WHEN MATCHED THEN 
WHEN NOT MATCHED THEN

MERGE문 예제

CREATE TABLE memberTBL (
  userid varchar(10) NOT NULL PRIMARY KEY ,
  username varchar(20) NOT NULL,
  addr varchar(20) NOT NULL
);
CREATE TABLE changeTBL(
  userid varchar(10) NOT NULL PRIMARY KEY ,
  username varchar(20),
  addr varchar(20) ,
  changetype varchar(20)
);
DROP TABLE memberTBL;
--변경될 테이블 (target table)
INSERT INTO memberTBL VALUES('LSG', '이승기', '서울');
INSERT INTO memberTBL VALUES('KBS', '김범수', '경남');
INSERT INTO memberTBL VALUES('KKH', '김경호', '전남');
INSERT INTO memberTBL VALUES('JYP', '조용필', '경기');
INSERT INTO memberTBL VALUES('SSK', '성시경', '서울');
INSERT INTO memberTBL VALUES('LJB', '임재범', '서울');
INSERT INTO memberTBL VALUES('YJS', '윤종신', '경남');
INSERT INTO memberTBL VALUES('EJW', '은지원', '경북');
INSERT INTO memberTBL VALUES('JKW', '조관우', '경기');
INSERT INTO memberTBL VALUES('BBK', '바비킴', '서울');
--변경기준이되는 소스(source table)
INSERT INTO changeTBL VALUES('TKV', '태권브이', '한국', '신규가입');
INSERT INTO changeTBL VALUES('LSG', NULL, '제주', '주소변경');
INSERT INTO changeTBL VALUES('LJB', NULL, '영국', '주소변경');
INSERT INTO changeTBL VALUES('BBK', NULL, '탈퇴', '회원탈퇴');
INSERT INTO changeTBL VALUES('SSK', NULL, '탈퇴', '회원탈퇴');
MERGE INTO memberTBL M --변경될 테이블 (target table)
USING changeTBL C --변경기준이되는 소스(source table)
ON (M.userid = C.userid)   --userID를 기준으로 두테이블을 비교
WHEN MATCHED THEN 
    UPDATE SET M.addr = C.addr -- taraget table에 source table의 행이 있으면 주소를 변경한다.
    DELETE WHERE C.changetype = '회원탈퇴' -- target table에 source table의 행이 있고, 
                                            -- 사유가 '회원탈퇴' 라면 해당 행을 삭제한다.
WHEN NOT MATCHED THEN--targer 테이블에 source table 의 행이 없으면 새로운 행을 추가한다.
    INSERT (userid, username, addr) VALUES(C.userid,C.username, C.addr);

내 생각 정리

  • 임시테이블을 생성해서 사용해도 될것 같다…

댓글남기기