본문 바로가기
프로그래밍/데이터베이스

오라클 MERGE INTO 문으로 있으면 UPDATE 없으면 INSERT 한번에 수행하기

by pentode 2018. 4. 20.

테이블에 데이터가 이미 존재하면 업데이트 하고, 존재하지 않으면 입력을 해야 하는 경우가 종종 있습니다. 오라클에서 이런 작업을 한번에 할 수 있는 쿼리가 MERGE INTO 문 입니다.

 

현실적인 예는 아니지만 간단하게 성적 테이블을 생각해 보겠습니다. 과정코드과 학생코드가 주키이고, 성적 필드를 가지고 있습니다.

 

CREATE TABLE TB_SCORE (
    COURSE_ID  VARCHAR2(10) NOT NULL,
    STUDENT_ID VARCHAR2(10) NOT NULL,
    SCORE      NUMBER(5, 2) NULL,
    CONSTRAINT PK_SCORE PRIMARY KEY (COURSE_ID, STUDENT_ID)
);

 

1. 동일한 테이블 구조를 가지고 있는 TMP_SCORE 테이블로부터 데이터를 옮기는 예입니다.

TMP_SCORE 테이블에 있는것과 동일한 과정코드와 학생코드를 가진 데이터가 TB_SCORE에 있으면 SCORE 를 업데이트하고, 없으면 입력합니다.

 

MERGE INTO TB_SCORE S
    USING TMP_SCORE T
       ON (S.COURSE_ID = T.COURSE_ID AND S.STUDENT_ID = T.STUDENT_ID)
    WHEN MATCHED THEN
        UPDATE SET S.SCORE = T.SCORE
    WHEN NOT MATCHED THEN
        INSERT (S.COURSE_ID, S.STUDENT_ID, S.SCORE) 
        VALUES (T.COURSE_ID, T.STUDENT_ID, T.SCORE)
;

 

USING 절에는 테이블외에 뷰, 인라인 뷰 등이 올 수도 있습니다.

 

 

2. 다른 테이블에서 데이터를 비교하여 가져오는 것이 아니라, 직접 값을 넣고자 한다면 DUAL을 사용할 수 있습니다.

 

MERGE INTO TB_SCORE S
    USING DUAL
       ON (S.COURSE_ID = 'C1' AND S.STUDENT_ID = 'S1')
    WHEN MATCHED THEN
        UPDATE SET S.SCORE = 20
    WHEN NOT MATCHED THEN
        INSERT (S.COURSE_ID, S.STUDENT_ID, S.SCORE)
        VALUES ('C1', 'S1', 20)
;

 

 

3. 업데이트나 입력 하나만 할 수도 있습니다. 

존재하면 아무것도 하지 않고, 없으면 입력하려면 다음과 같이 합니다.

 

MERGE INTO TB_SCORE S
    USING DUAL
       ON (S.COURSE_ID = 'C1' AND S.STUDENT_ID = 'S1')
    WHEN NOT MATCHED THEN
        INSERT (S.COURSE_ID, S.STUDENT_ID, S.SCORE)
        VALUES ('C1', 'S1', 20)
;

 

ON 뒤에 나오는 매칭 조건은 주키를 사용해야 합니다. 그렇지 않으면 입력시에 중복이 발생하여 에러가 날 수 있습니다.

반응형