[ORACLE] MERGE INTO 문으로 있으면 UPDATE 없으면 INSERT 한번에 수행하기 (머지 인서트 업데이트)_using on when matched then dual_--

0. 점수테이블 생성

 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. 강의ID컬럼과 학생ID컬럼에 같은형식값이 들어가는 임시점수테이블 생성

 CREATE TABLE TMP_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)

);

2. 임시점수테이블에 있는것과 동일한 강의ID와 학생ID를 가진 데이터가 점수테이블에 

있으면 점수를 UPDATE하고, 없으면 INSERT (임시테이블데이터를 점수테이블데이터에 옮기는 예)

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)

;

3. 다른 테이블에서 데이터를 비교하여 가져오는 것이 아니라, 직접 값을 넣고자 한다면 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)

;

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

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

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)

;



댓글

T O P