DB
[ORACLE]MERGE INTO USING
도비는자유에오
2022. 6. 5. 16:21
회사에서 요즘 회원 이벤트 구축 파트를 개발하고 있다.
업권별(EX.카드연결, 계좌연결 등등)로 이벤트를 참여 여부를 체크했는데, 안했을 때는 INSERT를 해서 이벤트 참여를 시키고 이미 참여했을 경우 UPDATE문으로 사용여부를 N으로 바꾸도록 했는데, 이 문제를 MERGE INTO를 사용하여 간단하게 개발하였다.
아래 코드는 회사 소스가 공유 불가능 하여 예시로 만들어 보았다.
SELECT 를 했을때 데이터가 없을 때 INSERT , 데이터가 있을 때 UPDATE 를 사용한다.
MERGE INTO[TABLE/VIEW]
USING [TABLE/VIEW/DUAL] --비교할 테이블 OR 뷰 (MERGE INTO 절의 테이블OR뷰와 동일 할 경우 DUAL 사용)
ON [조건] --UPDATE와 INSERT를 처리할 조건문(일치하면 UPDATE , 불일치 INSERT)
WHEN MATCHED THEN --일치하는 경우(UPDATE|DELETE)
UPDATE SET
[COLUMN1] = [VALUE1]
[COLUMN2] = [VALUE2]
(DELETE [TABLE] WHERE [COLUMN1] = [VALUE1] AND ...) -- DELETE 구문도 사용가능(단,오라클 10g 이상부터)
WHEN NOT MATCHED THEN --불일치하는 경우 INSERT
INSERT(COLUMN1, COLUMN2,...)
VALUES(VALUE1, VALUE2,...)
예제1) 같은 테이블 비교 후 MERGE INTO (DUAL 사용)
MERGE INTO emp A
USING DUAL
ON (A.empNo = '1004') --EMP테이블에 회원번호에 1004가 있으면
WHEN MATCHED THEN --일치할 경우
UPDATE
SET A.modiDate = SYSDATE -- 수정일 컬럼을 현재날짜로 UPDATE
WHEN NOT MATCHED THEN
INSERT(A.name, A.empno,A.regDate)
VALUES(1234,'DOBBY',SYSDATE);
2) 서로 다른 테이블 비교 후(서브쿼리) MERGE INTO
MERGE INTO emp A
USING(SELECT AA.empNo --emp테이블과 dept 테이블에 empNO 1004번과 depNO가 서로 같은 조건
,AA.job
,AA.deptNo
FROM emp AA
,dept BB
WHERE AA.empNo = '1004'
AND AA.deptNo = BB.deptNo) B
ON(A.empNo = B.empNo)
WHEN MATCHED THEN --일치 시 emp 테이블에 dept 테이블에 있는 deptNo, job컬럼 데이터를 UPDATE 시킨다.
UPDATE SET A.deptNo = B.deptNo
,A.job = B.job
WHEN NOT MATCHED THEN --불일치 시 emp 테이블에 데이터를 INSERT
INSERT(A.empNo, A.job, A.deptNo)
VALUES(B.empNo, B.job, B.deptNo)