본문 바로가기

Dev/DATABASE, SQL

드라이빙 테이블, Merge 문이란?

728x90

드라이빙 테이블은 조인시 가장 먼저 읽히는 테이블을 뜻한다.

 

ANSI JOIN의 경우는 순서 상관없이 옵티마이저가 자동으로 최적화해서 가장 좋은 전략을 짜준다. 하지만 오라클조인을 사용할 땐 순서가 중요해지는데 대학에서 배운대로 더 적은 테이블을 먼저 읽는 것이 성능에 좋다.

 

즉, 드라이빙 순서대로 테이블을 기술한다는 것은 "먼저 읽혀야 하는 테이블을 FROM 절에서 먼저 배치한다"는 의미이다.

 

MERGE INTO 대상_테이블 T
USING (서브쿼리 또는 소스 테이블) S
ON (조인 조건)
WHEN MATCHED THEN
    UPDATE SET 컬럼1 = 값1, 컬럼2 = 값2 ...
WHEN NOT MATCHED THEN
    INSERT (컬럼1, 컬럼2, ...)
    VALUES (값1, 값2, ...);

 

MERGE 문은 INSERT, UPDATE, DELETE를 한 번에 수행할 수 있는 SQL 문이다.
특히 데이터가 존재하면 UPDATE, 존재하지 않으면 INSERT하는 "UPSERT" 기능을 수행할 때 많이 사용된다.

 

  • MERGE INTO 대상_테이블 T → 데이터를 변경할 대상 테이블
  • USING (서브쿼리 또는 소스 테이블) S → 비교할 데이터를 제공하는 소스 테이블 또는 서브쿼리
  • ON (조인 조건) → 두 테이블 간 비교 조건
  • WHEN MATCHED THEN → 조인 조건이 일치하는 경우 UPDATE
  • WHEN NOT MATCHED THEN → 조인 조건이 일치하지 않는 경우 INSERT

예시를 들어보자.

MERGE INTO EMPLOYEES T
USING (SELECT 101 AS EMP_ID) S
ON (T.EMP_ID = S.EMP_ID)
WHEN MATCHED THEN
    UPDATE SET T.EMP_NAME = '새로운 이름', T.DEPT = '새로운 부서'
WHEN NOT MATCHED THEN
    INSERT (EMP_ID, EMP_NAME, DEPT)
    VALUES (S.EMP_ID, S.EMP_NAME, S.DEPT);

 

만약 T.EMP_ID = 10 인 것이 있다면 새로운 부서를 업데이트하고 없다면 인서트한다.

 

사용하기 어려워보이고 자칫 실수했을 때 리스크가 크기 때문에 조심해서 다뤄야한다.

'Dev > DATABASE, SQL' 카테고리의 다른 글

ANSI JOIN, ORACLE JOIN 차이점  (0) 2025.03.05
MySQL / ORACLE 의 GROUP BY 동작 차이  (0) 2025.03.03
[ORACLE] 오라클의 NULL 처리  (0) 2025.01.12
SQL - 날짜 출력 방법  (0) 2024.03.02