오늘 일 하다가 쿼리하나를 짰는데
유용한듯하여 정리할 겸 포스팅한다.
업무를 하다보면 다른 DB에 데이터가 존재하면 UPDATE,
존재하지 않으면 INSERT 해야하는 경우가 종종 있다.
그동안은 건수가 적어서 자료를 하나씩 대사해서
UPDATE 쿼리를 날렸지만,
오늘은 건수가 많아서
MERGE INTO 문을 작성해서 수행해보았다.
내가 수행한 쿼리는 업무를 위해 수행한것이므로 비밀이고..
예시를 들기위해 상황을 가정해보자.(가정이니까 정규화, 모델링 배제)
※가정)
모든직원 테이블과
A부서직원 테이블이 있다.
A부서에 신규사원이 들어왔는데 A부서가 인사팀에 얘기를 안해서
모든직원 테이블에 정보가 입력이 안되어있고
심지어 A부서 몇몇직원은 전화번호가 누락되어있다.
이때,
모든직원의 전화번호에 A부서직원의 전화번호를 UPDATE 하고
모든직원에 A부서직원이 존재하지 않으면 INSERT 하는 구문을 작성해보자.
MERGE INTO 모든직원
USING A부서직원
ON (모든직원.사번 = A부서직원.사번)
WHEN MATCHED THEN
UPDATE SET 모든직원.전화번호 = A부서직원.전화번호
WHEN NOT MATCHED THEN
INSERT (모든직원.사번, 모든직원.이름, 모든직원.전화번호)
VALUES (A부서직원.사번, A부서직원.이름, A부서직원.전화번호);
수행전
모든직원 테이블![]() |
A부서직원 테이블![]() |
수행후
수행쿼리 MERGE INTO ALL_MEMBER AM USING A_DEPT_MEMBER ADM ON (AM.E_NO = ADM.E_NO) WHEN MATCHED THEN UPDATE SET AM.E_PHONE = ADM.E_PHONE WHEN NOT MATCHED THEN INSERT (AM.E_NO, AM.E_NAME, AM.E_PHONE) VALUES (ADM.E_NO, ADM.E_NAME, ADM.E_PHONE); |
수행결과![]() |
모든직원 테이블에 누락되어있던 '홍길동', '유관순'의 전화번호가 UPDATE되었고
존재하지않던 '정약용'의 정보는 INSERT 된 것을 볼 수 있다.
존재하면 UPDATE, 없으면 INSERT를 동시에 수행할 수 있는 강력한 쿼리다.
MERGE INTO 구문의 강점은 UPDATE, INSERT 둘 중 하나만 수행할 수도 있다는거다.
예시는 위에서 캡처로 충분히 된듯하니 캡처는 안하고 구문만 기록해둬야겠다.
MERGE INTO ALL_MEMBER AM
USING A_DEPT_MEMBER ADM
ON (AM.E_NO = ADM.E_NO)
WHEN MATCHED THEN
UPDATE SET AM.E_PHONE = ADM.E_PHONE;
이런식으로 존재하면 UPDATE만 하고, 없으면 아무것도 수행안할수도 있으며 반대도 가능하다.
또한,
MERGE INTO ALL_MEMBER AM
USING DUAL
ON (AM.E_NO = '3')
WHEN MATCHED THEN
UPDATE SET AM.E_PHONE = '01098765432';
다른테이블에서 값을 가져오는 것이 아니라
직접 UPDATE나 INSERT를 하려면 DUAL을 사용하면 된다.
위의 쿼리는 다른테이블 필요없이 사번이 3인 사람의 전화번호를 UPDATE 하는 쿼리다.
'ORACLE' 카테고리의 다른 글
[ORACLE] 오라클 기본키 조회 하기 (0) | 2021.06.04 |
---|---|
[ORACLE] oracle decode 와 case when (0) | 2020.08.26 |
[ORACLE] oracle insert 여러개하기 (0) | 2020.02.20 |
[ORACLE] 정규표현식 REGEXP_LIKE (0) | 2019.12.03 |
댓글