컴퓨터/Oracle

Oracle (1) - MERGE INTO를 이용하여 간단하게 조건있는 데이터를 다루자

달서비 2023. 5. 31. 22:35

우리가 A라는 데이터를 만들 때 데이터가 있고 없는 경우에 따라 나누는 경우가 있습니다. PL/SQL을 이용하여 프로시저를 만드는 방법도 있지만 MERGE INTO라는 구문을 이용하면 쉽게 만들 수 있습니다.

 

예제 테이블

CREATE TABLE T1 (
    STU_NO   VARCHAR2(10) PRIMARY KEY, --학번
    STU_NAME VARCHAR2(10) NOT NULL, --이름
    SCR      NUMBER(5) --점수
);
 
CREATE TABLE T2 (
    STU_NO    VARCHAR2(10) PRIMARY KEY, --학번
    STU_GRADE VARCHAR2(2) NOT NULL, --학년
    STU_GEND  VARCHAR2(2), --성별
    SCR      NUMBER(5) --점수
);

CREATE TABLE T3 (
    STU_NO   VARCHAR2(10) PRIMARY KEY, --학번
    STU_NAME VARCHAR2(10) NOT NULL, --이름
    SCR      NUMBER(5) --점수
);

예제로 사용 테이블 T1, T2입니다.

 

MERGE INTO

먼저 구문은 다음과 같습니다.

MERGE INTO [table/view] -- 사용할 테이블
	USING [table/view/dual] -- 비교 대상 테이블
ON [conditions] -- 조건문
WHEN MATCHED THEN -- 조건이 맞는 경우 UPDATE 혹은 DELETE를 한다
UPDATE SET 
COL1 = [COL1]
[DELETE WHERE]
WHEN NOT MATCHED THEN -- 조건이 틀린경우 INSERT를 한다
INSERT (COL1) VALUES [COL1]
[WHERE]

간단하게 표현하자면 테이블 두 개를 비교하여 일치하는 경우 UPDATE 혹은 DELETE 명령을 수행하며 일치하지 않는 경우에는 INSERT 명령을 수행합니다. 해당 구문을 이용한 몇 가지 예제를 적어보겠습니다.

 

추가로 UPDATE 구문은 오라클9i부터 DELETE 구문은 오라클10g부터 사용할 수 있습니다.

 

1. T1과 똑같은 테이블인 T3 테이블로부터 T1의 데이터를 병합하는 예시입니다.

MERGE INTO T3
USING T1
ON (T1.STU_NO = T3.STU_NO)
WHEN MATCHED THEN
    UPDATE SET
    T3.STU_NAME = T1.STU_NAME,
    T3.SCR = T1.SCR
WHEN NOT MATCHED THEN
    INSERT (STU_NO, STU_NAME, SCR)
    VALUES (T1.STU_NO, T1.STU_NAME, T1.SCR);

T1 테이블과 동일한 T3 테이블이 있습니다. T1에 있는 데이터를 T3에 병합하는 과정입니다. STU_NO의 데이터는 바뀔 수 없는 데이터고 나머지 데이터는 수정될 수 있습니다. 데이터가 있는 경우 그리고 없는 경우 2가지를 나눠 있는 경우에는 T1의 데이터를 UPDATE하며 없는 경우에는 INSERT를 통하여 데이터를 생성합니다.

 

2. 조건을 만족하는 경우에 UPDATE만 하는 예시입니다.

MERGE INTO T3
USING T1
ON (T1.STU_NO = T3.STU_NO)
WHEN MATCHED THEN
    UPDATE SET
    T3.STU_NAME = T1.STU_NAME,
    T3.SCR = T1.SCR
    WHERE T3.STU_NO LIKE '2023%'

WHEN MATCHED THEN / WHEN MATCHED THEN 두 구문을 같이 사용할 수도 있으나 하나만 사용할 수도 있습니다. 

위의 예시는 T3 테이블의 데이터 중 2023으로 시작하는 STU_NO의 정보를 가지고 있는 데이터만 T1의 데이터와 병합합니다.

 

3. DELETE를 사용하는 예시입니다.

MERGE INTO T3
USING T1
ON (T1.STU_NO = T3.STU_NO)
WHEN MATCHED THEN
    DELETE
    WHERE T3.STU_NO LIKE '2023%'

2번의 예시는 데이터를 수정하는 구문이라면 3번의 예시는 2023으로 시작하는 STU_NO의 정보를 가지고 있는 데이터를 삭제합니다.

 

4. 서브쿼리를 사용하는 방법

MERGE INTO T1
USING (
        SELECT T2.STU_NO, T2.STU_GEND, T2.SCR
        FROM T2
        WHERE T2.STU_GEND = '남자'
      ) TT2
ON (T1.STU_NO = TT2.STU_NO)
WHEN MATCHED THEN
    UPDATE SET
    T1.SCR = TT2.SCR;

마지막으로 서브쿼리를 이용한 예시입니다. 서브쿼리를 이용하여 복잡한 구문을 만들 수도 있습니다. 위의 예제는 TT2 테이블의 데이터 중 성별이 '남자'인 데이터만 가져옵니다. (TT2) 그리고 T1 테이블과 일치하는지 확인하며, 있는 경우 점수를 수정합니다.

 

현재 회사에서 어쩌다 보니 오라클을 메인으로 사용하고 있습니다. 직장에서 많이 사용하는 구문, 방법들을 앞으로 한 개씩 정리하려고 합니다.