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 |