개발_DB/RDBMS

Oracle | SQL - MERGE를 이용해서 데이터가 있으면 UPDATE, 없으면 INSERT하기

zuyo 2021. 5. 13. 00:04
반응형

MERGE를 이용해서 데이터가 있으면 UPDATE, 없으면 INSERT 하도록 있다.

경우에 따라 MATCHED, NOT MATCHED 하나만 써도 상관 없다.

 

1)

챔피언스 리그에 출전하게 되면 리그 DB 데이터가 남게 된다. (참가횟수, 우승횟수 )

과거에 출전한 팀의 경우에는 기존 데이터를 갱신,

출전한 팀의 경우에는 데이터를 삽입하도록 한다.

(FIFA_TEAM 테이블에는 모든 팀의 데이터가 들어있다.)

MERGE INTO CAHMPS_TEAM C -- 삽입/수정의 대상이 될 테이블
    USING FIFA_TEAM F -- 원본 데이터가 있는 테이블
       ON (C.ID = F.ID) -- 조건
    WHEN MATCHED THEN -- 조건이 맞을 때 (과거 참가 데이터가 있는 팀의 경우)
        UPDATE SET C.PCOUNT = C.PCOUNT + 1 -- 실행할 쿼리 (참가 횟수 갱신)
    WHEN NOT MATCHED THEN -- 조건이 맞지 않을 때 (처음 참가하는 팀의 경우)
        INSERT (ID, TNAME, PCOUNT, WCOUNT, …)  -- 실행할 쿼리 (신규 등록)
        VALUES (F.ID, F.TNAME, 1, 0, …)

 

2)

OO초등학교에서는 매년 신체검사를 한다.

작년 신체검사 데이터가 있는 학생들의 경우는 기존 데이터를 갱신

1학년이나 전학생의 경우 데이터를 새로 삽입하도록 한다.

MERGE INTO STUDENT S -- 삽입/수정의 대상이 될 테이블 (학생 테이블)
    USING DUAL
       ON (S.ID = '1234567') -- 조건 (PK를 조건에 넣을 것, 데이터 중복 발생할 수 있으므로)
    WHEN MATCHED THEN -- 조건에 맞는 행이 있는 경우
        UPDATE SET S.HEIGHT = 140 -- 실행할 쿼리 (신장 갱신)
    WHEN NOT MATCHED THEN -- 조건이 맞는 행이 없는 경우
        INSERT (ID, NAME, HEIGHT, WEIGHT, …) -- 실행할 쿼리
        VALUES ('1234567', '요하니', 140, 35, ...)

 

반응형