[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)
;
댓글
댓글 쓰기