MERGE
MERGE (병합)
원본 테이블의 내용에 따라 대상 테이블의 행을 조건부로 갱신·삭제·삽입하는 문법이에요. 비슷한 구조의 두 테이블 데이터를 주기적으로 합칠 때 사용해요.
출처: 문서
본문
테이블의 행을 조건부로 갱신·삭제하고 테이블에 새 행을 삽입해요.
MERGE는 source_table의 내용에 따라 target_table의 데이터를 변경해요. search_condition은 동일 컬럼 간의 관계 같은 조건을 정의해 소스와 타깃 데이터를 연관시켜요.
MERGE는 임의 개수의 WHEN 절을 지원해요. MATCHED 조건은 타깃 데이터에 DELETE나 UPDATE 연산을 실행할 수 있고, NOT MATCHED 조건은 INSERT로 소스의 데이터를 타깃 테이블에 추가할 수 있어요. 추가 조건은 영향을 받는 행을 좁힐 수 있어요.
각 소스 행에 대해 WHEN 절은 순서대로 처리돼요. 첫 번째로 일치하는 WHEN 절만 실행되고 이후 절은 무시돼요. 단일 타깃 테이블 행이 둘 이상의 소스 행과 일치하면 쿼리는 실패해요.
UPDATE 연산이 있는 WHEN 절에서 컬럼 값 표현식은 타깃이나 소스의 어떤 필드에도 의존할 수 있어요. NOT MATCHED 경우 INSERT 표현식은 소스의 어떤 필드에도 의존할 수 있어요.
MERGE의 전형적인 사용은 구조가 비슷하고 서로 다른 데이터를 담은 두 테이블이에요. 예를 들어 소스 테이블은 프로덕션 시스템에서 트랜잭션 사용의 일부이고, 타깃 테이블은 분석에 쓰이는 데이터 웨어하우스에 있어요. 주기적으로 MERGE 연산을 실행해 최근 프로덕션 데이터를 분석 웨어하우스의 장기 데이터와 결합해요. 두 테이블 사이에 검색 조건을 정의할 수 있다면, 아주 다른 테이블도 사용할 수 있어요.
시그니처
MERGE INTO target_table [ @ branch_name ] [ [ AS ] target_alias ]
USING { source_table | query } [ [ AS ] source_alias ]
ON search_condition
when_clause [...]
when_clause는 다음 중 하나예요:
WHEN MATCHED [ AND condition ]
THEN DELETE
WHEN MATCHED [ AND condition ]
THEN UPDATE SET ( column = expression [, ...] )
WHEN NOT MATCHED [ AND condition ]
THEN INSERT [ column_list ] VALUES (expression, ...)
예시
소스 테이블에 언급된 모든 고객을 삭제해요:
MERGE INTO accounts t USING monthly_accounts_update s
ON t.customer = s.customer
WHEN MATCHED
THEN DELETE
일치하는 고객 행에 대해 구매 횟수를 증가시키고, 일치하지 않으면 소스 테이블의 행을 삽입해요:
MERGE INTO accounts t USING monthly_accounts_update s
ON (t.customer = s.customer)
WHEN MATCHED
THEN UPDATE SET purchases = s.purchases + t.purchases
WHEN NOT MATCHED
THEN INSERT (customer, purchases, address)
VALUES(s.customer, s.purchases, s.address)
소스 테이블에서 타깃 테이블로 MERGE를 실행하되, 소스 주소가 Centreville인 일치하는 타깃 행은 삭제해요. 다른 모든 일치 행은 소스 구매 횟수를 더하고 주소를 소스 주소로 설정해요. 타깃 테이블에 일치가 없으면 소스 테이블 행을 삽입해요:
MERGE INTO accounts t USING monthly_accounts_update s
ON (t.customer = s.customer)
WHEN MATCHED AND s.address = 'Centreville'
THEN DELETE
WHEN MATCHED
THEN UPDATE
SET purchases = s.purchases + t.purchases, address = s.address
WHEN NOT MATCHED
THEN INSERT (customer, purchases, address)
VALUES(s.customer, s.purchases, s.address)
소스 테이블의 audit 브랜치에 언급된 모든 고객을 삭제해요:
MERGE INTO accounts @ audit t USING monthly_accounts_update s
ON t.customer = s.customer
WHEN MATCHED
THEN DELETE
제한 사항
어떤 커넥터든 MERGE 문의 소스 테이블로 사용할 수 있어요. MERGE 문을 지원하는 커넥터만 병합 연산의 타깃이 될 수 있어요. 자세한 내용은 커넥터 문서를 참고해요.
더 알아보기 (Learn more)
MERGE를 이루는 기본 데이터 조작 문인 SELECT, INSERT, UPDATE, DELETE를 함께 보면 병합 로직을 더 유연하게 설계할 수 있어요.