본문 바로가기
학습/DB

MERGE INTO(oracle)

코동이 2021. 10. 7.

 오라클 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

 

 

<참고>

 

https://offbyone.tistory.com/253

반응형

'학습 > DB' 카테고리의 다른 글

JPA를 이용해 자동으로 시간, 작성자 추가하기  (1) 2021.12.14
다형성 쿼리  (0) 2021.10.07
서브쿼리  (0) 2021.10.06
조인  (0) 2021.10.06
프로젝션(엔티티, 임베디드, 스칼라타입)  (0) 2021.10.06