MERGE INTO
적용 대상: Databricks SQL Databricks Runtime
원본 테이블을 기반으로 하는 업데이트, 삽입, 삭제 집합을 대상 델타 테이블에 병합합니다.
이 문은 Delta Lake 테이블에 대해서만 지원됩니다.
이 페이지에는 명령과 함께 올바른 구문을 사용하는 방법에 대한 세부 정보가 포함되어 있습니다 MERGE
. 작업을 사용하여 MERGE
데이터를 관리하는 방법에 대한 자세한 지침은 병합을 사용하여 Delta Lake 테이블에 Upsert를 참조하세요.
구문
MERGE [ WITH SCHEMA EVOLUTION ] INTO target_table_name [target_alias]
USING source_table_reference [source_alias]
ON merge_condition
{ WHEN MATCHED [ AND matched_condition ] THEN matched_action |
WHEN NOT MATCHED [BY TARGET] [ AND not_matched_condition ] THEN not_matched_action |
WHEN NOT MATCHED BY SOURCE [ AND not_matched_by_source_condition ] THEN not_matched_by_source_action } [...]
matched_action
{ DELETE |
UPDATE SET * |
UPDATE SET { column = { expr | DEFAULT } } [, ...] }
not_matched_action
{ INSERT * |
INSERT (column1 [, ...] ) VALUES ( expr | DEFAULT ] [, ...] )
not_matched_by_source_action
{ DELETE |
UPDATE SET { column = { expr | DEFAULT } } [, ...] }
매개 변수
WITH SCHEMA EVOLUTION
적용 대상: Databricks Runtime 15.2 이상
이
MERGE
작업에 대해 자동 스키마 진화를 사용하도록 설정합니다. 사용하도록 설정하면 대상 델타 테이블의 스키마가 원본 테이블의 스키마와 일치하도록 자동으로 업데이트됩니다.-
수정할 테이블을 식별하는 테이블 이름입니다. 참조되는 테이블은 델타 테이블이어야 합니다.
테이블은 외세의 테이블이 아니어야 합니다.
-
대상 테이블의 테이블 별칭입니다. 별칭에 열 목록을 포함하면 안 됩니다.
-
대상 테이블에 병합할 원본 테이블을 식별하는 테이블 이름입니다.
-
원본 테이블의 테이블 별칭입니다. 별칭에 열 목록을 포함하면 안 됩니다.
-
한 관계의 행을 다른 관계의 행과 결합하는 방법입니다. 반환 형식이 BOOLEAN인 식입니다.
WHEN MATCHED [ AND
matched_condition]
WHEN MATCHED
절은merge_condition
및 선택적match_condition
을 기반으로 원본 행이 대상 테이블 행과 일치할 때 실행됩니다.matched_action
DELETE
일치하는 대상 테이블 행을 삭제합니다.
일치 항목이 무조건 삭제되면 다중 일치가 허용됩니다. 조건부 삭제는 일치 항목이 여러 개 있어도 모호하지 않습니다.
UPDATE
일치하는 대상 테이블 행을 업데이트합니다.
대상 델타 테이블의 모든 열을 원본 데이터 세트의 해당 열로 업데이트하려면
UPDATE SET *
를 사용합니다. 이 작업은 대상 델타 테이블의 모든 열에 대한UPDATE SET col1 = source.col1 [, col2 = source.col2 ...]
와 동일합니다. 따라서 이 작업은 원본 테이블의 열이 대상 테이블의 열과 동일하다고 가정합니다. 그렇지 않으면 쿼리에서 분석 오류를 throw합니다.참고 항목
이 동작은 자동 스키마 진화를 사용하도록 설정하면 변경됩니다. 자세한 내용은 Delta Lake 병합을 위한 자동 스키마 진화를 참조하세요.
적용 대상: Databricks SQL Databricks Runtime 11.3 LTS 이상
DEFAULT
를expr
로 지정하여 명시적으로 열을 기본값으로 업데이트할 수 있습니다.
여러
WHEN MATCHED
절이 있는 경우 지정된 순서대로 평가됩니다. 마지막 절을 제외한 각WHEN MATCHED
절에는matched_condition
이 있어야 합니다. 그렇지 않으면 쿼리는 NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION 오류를 반환합니다.merge_condition
과 일치하는 원본 및 대상 행 쌍에 대해WHEN MATCHED
조건 중 어느 것도 true로 평가되지 않으면 대상 행은 변경되지 않은 상태로 유지됩니다.WHEN NOT MATCHED [BY TARGET] [ AND
not_matched_condition]
WHEN NOT MATCHED
절은 원본 행이merge_condition
및 선택적not_matched_condition
을 기반으로 하는 대상 행과 일치하지 않을 때 행을 삽입합니다.적용 대상: Databricks SQL Databricks Runtime 12.2 LTS 이상
WHEN NOT MATCHED BY TARGET
는WHEN NOT MATCHED
의 별칭으로 사용할 수 있습니다.not_matched_condition
은 부울 식이어야 합니다.INSERT *
원본 데이터 세트의 해당 열과 함께 대상 Delta 테이블의 모든 열을 삽입합니다. 이 작업은 대상 델타 테이블의 모든 열에 대한
INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...])
와 동일합니다. 이 작업을 수행하려면 원본 테이블에 대상 테이블의 열과 동일한 열이 있어야 합니다.참고 항목
이 동작은 자동 스키마 진화를 사용하도록 설정하면 변경됩니다. 자세한 내용은 Delta Lake 병합을 위한 자동 스키마 진화를 참조하세요.
INSERT ( ... ) VALUES ( ... )
지정한 열과 해당 식에 따라 새 행이 생성됩니다. 대상 테이블의 모든 열을 지정할 필요가 없습니다. 지정되지 않은 대상 열의 경우 열 기본값이 삽입되고, 열이 없으면
NULL
입니다.적용 대상: Databricks SQL Databricks Runtime 11.3 LTS 이상
DEFAULT
를 식으로 지정하여 대상 열의 열 기본값을 명시적으로 삽입할 수 있습니다.
여러
WHEN NOT MATCHED
절이 있는 경우 지정된 순서대로 평가됩니다. 마지막 절을 제외한 모든WHEN NOT MATCHED
절에는not_matched_condition
이 있어야 합니다. 그렇지 않으면 쿼리는 NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION 오류를 반환합니다.WHEN NOT MATCHED BY SOURCE [ AND
not_matched_by_source_condition]
적용 대상: Databricks SQL Databricks Runtime 12.2 LTS 이상
WHEN NOT MATCHED BY SOURCE
절은 대상 행이merge_condition
에 따라 원본 테이블의 행과 일치하지 않고 선택적not_match_by_source_condition
이 true로 평가될 때 실행됩니다.not_matched_by_source_condition
은 대상 테이블의 열만 참조하는 부울 식이어야 합니다.not_matched_by_source_action
DELETE
대상 테이블 행을 삭제합니다.
UPDATE
대상 테이블 행을 업데이트합니다.
expr
는 대상 테이블의 열만 참조할 수 있습니다. 그렇지 않으면 쿼리가 분석 오류를 throw합니다.적용 대상: Databricks SQL Databricks Runtime 11.3 LTS 이상
DEFAULT
를expr
로 지정하여 명시적으로 열을 기본값으로 업데이트할 수 있습니다.
Important
merge_condition
이 false로 평가될 때 대상 행을 업데이트하거나 삭제하는WHEN NOT MATCHED BY SOURCE
절을 추가하면 많은 수의 대상 행이 수정될 수 있습니다. 최상의 성능을 위해not_matched_by_source_condition
을 적용하여 업데이트되거나 삭제된 대상 행의 수를 제한합니다.WHEN NOT MATCHED BY SOURCE clauses
가 여러 개인 경우 지정된 순서대로 평가됩니다. 마지막 절을 제외한 각WHEN NOT MATCHED BY SOURCE
절에는not_matched_by_source_condition
이 있어야 합니다. 그렇지 않으면 쿼리는 NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION 오류를 반환합니다.merge_condition
에 따라 원본 테이블의 행과 일치하지 않는 대상 행에 대해WHEN NOT MATCHED BY SOURCE
조건 중 어느 것도 true로 평가되지 않는 경우 대상 행은 변경되지 않은 상태로 유지됩니다.
Important
MERGE
원본 테이블에서 둘 이상의 행이 and 절에 지정된 ON
조건에 따라 대상 테이블의 동일한 행과 일치하는 경우 DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE 오류로 WHEN MATCHED
인해 작업이 실패합니다. 병합의 SQL 의미 체계에 따르면 일치하는 대상 행을 업데이트하는 데 어떤 원본 행을 사용해야 하는지 불분명하기 때문에 이러한 유형의 업데이트 작업은 모호합니다. 원본 테이블을 전처리하여 여러 일치 항목이 발생할 가능성을 제거할 수 있습니다. 변경 데이터 캡처 예제를 참조하세요. 이 예제에서는 변경 내용을 대상 델타 테이블에 적용하기 전에 변경 데이터 세트(원본 데이터 세트)를 전처리하여 각 키에 대한 최신 변경 내용만 유지합니다. Databricks Runtime 15.4 LTS 이하 MERGE
에서는 여러 일치 항목을 평가하기 전에 절의 ON
조건만 고려합니다.
예제
데이터 중복 제거, 변경 데이터 upsert, SCD 형식 2 작업 적용 등과 같은 복잡한 작업에는 MERGE INTO
를 사용할 수 있습니다. 몇 가지 예제는 병합 예제를 사용하여 Delta Lake 테이블에 Upsert를 참조하세요.
WHEN MATCHED
-- Delete all target rows that have a match in the source table.
> MERGE INTO target USING source
ON target.key = source.key
WHEN MATCHED THEN DELETE
-- Conditionally update target rows that have a match in the source table using the source value.
> MERGE INTO target USING source
ON target.key = source.key
WHEN MATCHED AND target.updated_at < source.updated_at THEN UPDATE SET *
-- Multiple MATCHED clauses conditionally deleting matched target rows and updating two columns for all other matched rows.
> MERGE INTO target USING source
ON target.key = source.key
WHEN MATCHED AND target.marked_for_deletion THEN DELETE
WHEN MATCHED THEN UPDATE SET target.updated_at = source.updated_at, target.value = DEFAULT
WHEN NOT MATCHED [BY TARGET]
-- Insert all rows from the source that are not already in the target table.
> MERGE INTO target USING source
ON target.key = source.key
WHEN NOT MATCHED THEN INSERT *
-- Conditionally insert new rows in the target table using unmatched rows from the source table.
> MERGE INTO target USING source
ON target.key = source.key
WHEN NOT MATCHED BY TARGET AND source.created_at > now() - INTERVAL “1” DAY THEN INSERT (created_at, value) VALUES (source.created_at, DEFAULT)
WHEN NOT MATCHED BY SOURCE
-- Delete all target rows that have no matches in the source table.
> MERGE INTO target USING source
ON target.key = source.key
WHEN NOT MATCHED BY SOURCE THEN DELETE
-- Multiple NOT MATCHED BY SOURCE clauses conditionally deleting unmatched target rows and updating two columns for all other matched rows.
> MERGE INTO target USING source
ON target.key = source.key
WHEN NOT MATCHED BY SOURCE AND target.marked_for_deletion THEN DELETE
WHEN NOT MATCHED BY SOURCE THEN UPDATE SET target.value = DEFAULT
WITH SCHEMA EVOLUTION
-- Multiple MATCHED and NOT MATCHED clauses with schema evolution enabled.
> MERGE WITH SCHEMA EVOLUTION INTO target USING source
ON source.key = target.key
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *
WHEN NOT MATCHED BY SOURCE THEN DELETE