코딩 개발/ORACLE

[Oracle] MERGE INTO, USING ON, WHEN (NOT) MATCHED THEN

호소세 2024. 3. 29. 17:53
728x90
반응형

오늘은 oracle MERGE INTO 문에 대해서 알아보겠습니다.

 

MERGE INTO 문 작동방식

  1. MERGE INTO: 테이블 이름을 지정합니다.
  2. USING: 데이터를 가져올 테이블 또는 서브쿼리를 지정합니다.
  3. ON: 테이블과 USING 테이블을 연결하는 조건을 지정합니다.
  4. WHEN MATCHED THEN: ON 조건에 일치하는 행에 대해 수행할 작업을 지정합니다. 일반적으로 UPDATE 작업을 수행합니다.
  5. WHEN NOT MATCHED THEN: ON 조건에 일치하는 행이 없는 경우 수행할 작업을 지정합니다. 일반적으로 INSERT 작업을 수행합니다.

사실 이론적으로 말해도 예시를 안 보면 이해가 잘 안 되더라고요.(저는요)

그래서 예시를 한번 보겠습니다.

 

예시

EMPLOYEE 테이블

EMPLOYEE_ID EMPLOYEE_NAME DEPARTMENT_ID
101 John 1
102 Jane 2

 

DEPARTMENT 테이블

DEPARTMENT_ID DEPARTMENT_NAME
1 HR
2 Finance
3 IT

 

예시 1

EMPLOYEE 테이블에 DEPARTMENT_NAME을 넣고

DEPARTMENT 테이블에 있는 DEPARTMENT_NAME으로 추가하고 싶을 때

 

어떻게 하면 좋을까요?

1. EMPLOYEE 테이블에 DEPARTMENT_NAME column을 추가합니다.

ALTER TABLE EMPLOYEE ADD DEPARTMENT_NAME VARCHAR(100);

 

2. MERGE INTO 문 사용

MERGE INTO EMPLOYEE E
USING DEPARTMENT D
ON (E.DEPARTMENT_ID = D.DEPARTMENT_ID)
WHEN MATCHED THEN
    UPDATE SET E.DEPARTMENT_NAME = D.DEPARTMENT_NAME;

 

보시면

1. EMPLOYEE 테이블의 부서 ID와  DEPARTMENT 테이블의 ID가 같다는 조건이

2. MATCHED 되면 부서이름을 UPDATE 해라라는 문장입니다.

 

예시 2

이번에는 새로운 인원을 EMPLOYEE 테이블에 넣는 법을 알아보겠습니다.

MERGE INTO EMPLOYEE E USING (
  SELECT
    103 AS EMPLOYEE_ID,
    '호소세' AS EMPLOYEE_NAME,
    3 AS DEPARTMENT_ID,
    'IT' AS DEPARTMENT_NAME
  FROM
    DUAL
) D ON (E.EMPLOYEE_ID = D.EMPLOYEE_ID)
WHEN NOT MATCHED THEN
INSERT
  (
    EMPLOYEE_ID,
    EMPLOYEE_NAME,
    DEPARTMENT_ID,
    DEPARTMENT_NAME
  )
VALUES
  (
    D.EMPLOYEE_ID,
    D.EMPLOYEE_NAME,
    D.DEPARTMENT_ID,
    D.DEPARTMENT_NAME
  );

 

DUAL 테이블을 이용해서 MERGE 문을 많이 사용하더라고요.

1. EMPLOYEE 테이블에 저 인원이 있는지 없는지 확인하는 조건문 작성

2. 조건이 맞지 않으면 EMPLOYEE 테이블에 인원을 추가하게 됩니다.

 

EMPLOYEE_ID EMPLOYEE_NAME DEPARTMENT_ID DEPARTMENT_NAME
101 John 1 HR
102 Jane 2 Finance
103 호소세 3 IT

이런 식으로 추가가 될 겁니다.

 

이렇게 해서 조건문에 따른 동작을 설정하면 됩니다.

 

소감

우사인볼트가 이런 말을 했습니다. '나는 고작 몇 초를 위해서 4년을 연습하는데 사람들은 2개월하고 성과가 안나온다고 포기한다.'

저도 성과가 안나온다고 포기하지 않을 것이고, 계단식 성장을 한다고 생각할 것입니다. 여러분도 열심히 하다보면 언젠가는 멋진 사람이 되지 않을까 생각합니다.

반응형