오라클 DB를 사용하다보면, 특정 테이블을 수정해야 할 때가 있다. 테이블 수정하려는데, 해당 케이스가 없다면 추가해야되는 상황도 있다. 이처럼 특정 테이블에 UPDATE와 INSERT를 같이하는 경우 ORACLE에서 MERGE INTO를 사용하여 해결할 수 있다.
* 테이블, 데이터 생성
CREATE TABLE BEFORE_SCORE (
STUDENT_ID VARCHAR2(100),
SCORE NUMBER(5,2)
CONSTRAINT PK_BEFORE_SCORE PRIMARY KEY (STUDENT_ID)
)
과거 점수 테이블 BEFORE_SCORE를 생성한다. (현재 점수 테이블 NOW_SCORE도 똑같은 칼럼과 기본키를 가진다.)
INSERT INTO BEFORE_SCORE(STUDENT_ID, SCORE) VALUES (1, 20);
INSERT INTO BEFORE_SCORE(STUDENT_ID, SCORE) VALUES (2, 20);
INSERT INTO BEFORE_SCORE(STUDENT_ID, SCORE) VALUES (3, 20);
INSERT INTO NOW_SCORE(STUDENT_ID, SCORE) VALUES (2, 30);
INSERT INTO NOW_SCORE(STUDENT_ID, SCORE) VALUES (3, 40);
INSERT INTO NOW_SCORE(STUDENT_ID, SCORE) VALUES (4, 50);
각 테이블에 데이터를 넣는다. NOW_SCORE에 따라서 BEFORE_SCORE를 변화시킬 데이터이다.
* 테이블 조인하여 UPDATE & INSERT하기
과거 점수 테이블에 현재 점수 테이블을 조인해서 새롭게 UPDATE를 한다. 만약 새로운 학생이 현재 점수 테이블에만 있다면, 과거 점수 테이블에 새롭게 추가한다.
MERGE INTO BEFORE_SCORE B
USING NOW_SCORE N
ON (B.STUDENT_ID = N.STUDENT_ID)
WHEN MATCHED THEN
UPDATE SET B.SCORE = N.SCORE
WHEN NOT MATCHED THEN
INSERT (STUDENT_ID, SCORE)
VALUES (N.STUDENT_ID, N.SCORE)
MERGE INTO에는 기준 테이블이 온다.
USING에는 단순 테이블이 아니라 서브쿼리로 새로운 테이블이 와도 상관 없다.
ON에는 조인처럼 () 안에 조인할 칼럼을 정한다
WHEN MATCHED THEN, WHEN NOT MATCHED THEN 는 각각 UPDATE, 없을겨우 INSERT를 수행한다.
(꼭 2개다 사용할 필요는 없고 한개만 사용해도 된다)
3개 행 이(가) 병합되었습니다.
MERGE INTO문을 실행하면 3개 행이 병합되었다는 스크립트가 추가된다.
결과는 아래와 같다.
STUDENT_ID | SCORE |
1 | 20 |
2 | 30 |
3 | 40 |
4 | 50 |
<참고>
반응형
'학습 > DB' 카테고리의 다른 글
JPA를 이용해 자동으로 시간, 작성자 추가하기 (1) | 2021.12.14 |
---|---|
다형성 쿼리 (0) | 2021.10.07 |
서브쿼리 (0) | 2021.10.06 |
조인 (0) | 2021.10.06 |
프로젝션(엔티티, 임베디드, 스칼라타입) (0) | 2021.10.06 |