MERGE INTO
적용 대상: Databricks SQL
Databricks Runtime
업데이트, 삽입 및 삭제 set을 원본 table에 기반하여 대상 델타 table로 병합합니다.
이 문장은 Delta Lake tables만 지원됩니다.
이 페이지에는 명령과 함께 올바른 구문을 사용하는 방법에 대한 세부 정보가 포함되어 있습니다 MERGE
.
구문
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 } } [, ...] }
Parameters
WITH SCHEMA EVOLUTION
적용 대상:
Databricks Runtime 15.2 이상
이
MERGE
작업에 대해 자동 schema 진화 사용하도록 설정합니다. 사용하도록 설정하면 대상 Delta table의 schema은 원본 table의 schema와 일치하도록 자동으로 업데이트됩니다.-
수정할 table 식별하는 Table 이름. 참조된 table는 반드시 델타 table이어야 합니다.
이름에 옵션 사양이 포함되어서는 안됩니다.
table은 외국의 table이 되어서는 안 됩니다.
-
대상 table의 Table 별칭. 별칭에는 columnlist포함하면 안 됩니다.
-
대상
에 병합할 원본 를 식별하는 이름입니다. -
원본 table에 대한 Table 별칭. 별칭에는 columnlist포함하면 안 됩니다.
-
한 관계의 행을 다른 관계의 행과 결합하는 방법입니다. 반환 형식이 BOOLEAN인 식입니다.
WHEN MATCHED [ AND
matched_condition]
WHEN MATCHED
절은 원본 행이merge_condition
및 선택적match_condition
를 기반으로 대상 table 행과 일치할 때 실행됩니다.matched_action
DELETE
일치하는 대상 table 행을 삭제합니다.
일치 항목이 무조건 삭제되면 다중 일치가 허용됩니다. 조건부 삭제는 일치 항목이 여러 개 있어도 모호하지 않습니다.
UPDATE
일치하는 대상 table 행을 업데이트합니다.
대상 Delta table의 모든 columns을 원본 데이터 세트의 해당 columns와
UPDATE SET *
를 사용하여 update합니다. 이는 대상 델타 table의 모든 columns에 대해UPDATE SET col1 = source.col1 [, col2 = source.col2 ...]
과 동일합니다. 따라서 이 작업은 원본 table에 대상 table에 있는 것과 동일한 columns이 있다고 가정합니다. 그렇지 않으면 쿼리가 분석 오류를 발생시킵니다.참고 항목
자동 schema 진화를 사용하도록 설정하면 이 동작이 변경됩니다. 자세한 내용은 Delta Lake 병합에 대한
자동 진화를 참조하세요. 적용 대상:
Databricks SQL
Databricks Runtime 11.3 LTS 이상
column 기본값으로 명시적으로 update
DEFAULT
expr
지정할 수 있습니다.
여러
WHEN MATCHED
절이 있는 경우 지정된 순서대로 평가됩니다. 마지막 절을 제외한 각WHEN MATCHED
절에는matched_condition
이 있어야 합니다. 그렇지 않으면 쿼리는 NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION 오류를 반환합니다.WHEN MATCHED
과 일치하는 원본 및 대상 행 쌍에 대해merge_condition
조건 중 어느 것도 true로 평가되지 않으면 대상 행은 변경되지 않은 상태로 유지됩니다.WHEN NOT MATCHED [BY TARGET] [ AND
not_matched_condition]
WHEN NOT MATCHED
절은 원본 행이merge_condition
및 선택적not_matched_condition
을 기반으로 아무 대상 행과도 일치하지 않는 경우, 행을 insert합니다.적용 대상:
Databricks SQL
Databricks Runtime 12.2 LTS 이상
WHEN NOT MATCHED BY TARGET
는WHEN NOT MATCHED
의 별칭으로 사용할 수 있습니다.not_matched_condition
은 부울 식이어야 합니다.INSERT *
대상 델타 table의 모든 columns을 원본 데이터 세트의 해당 columns와 함께 삽입합니다. 이는 대상 델타 table의 모든 columns에 대해
INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...])
와 동일합니다. 원본 table이(가) 대상 table에 있는 것과 동일한 columns을(를) 갖고 있어야 이 작업을 수행할 수 있습니다.참고 항목
자동 schema 진화를 사용하도록 설정하면 이 동작이 변경됩니다. 자동 schema 진화를 위한 Delta Lake 병합의 세부사항을 참조하세요.
INSERT ( ... ) VALUES ( ... )
새 행은 지정된 column 및 해당 식을 기반으로 생성됩니다. 대상 table의 모든 columns를 지정할 필요가 없습니다. 지정되지 않은 대상 columns의 경우 column 기본값이 삽입되거나, 존재하지 않는 경우
NULL
가 삽입됩니다.적용 대상:
Databricks SQL
Databricks Runtime 11.3 LTS 이상
DEFAULT
을 표현식으로 지정하여 대상 column의 기본 column을 명시적으로 insert할 수 있습니다.
여러
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
절은 대상 행이 원본 table 행과merge_condition
에 따라 일치하지 않고, 선택적not_match_by_source_condition
이 true로 평가될 때 실행됩니다.not_matched_by_source_condition
는 대상 table의 columns만을 참조하는 부울 식이어야 합니다.not_matched_by_source_action
DELETE
대상 table 행을 삭제합니다.
UPDATE
대상 table 행을 업데이트합니다.
expr
는 오직 대상 table의 columns만 참조할 수 있습니다. 그렇지 않으면 쿼리가 분석 오류를 발생시킵니다.적용 대상:
Databricks SQL
Databricks Runtime 11.3 LTS 이상
DEFAULT
을(를)expr
으로 지정하여 column을(를) 기본값으로 명시적으로 update할 수 있습니다.
Important
merge_condition
가 false로 평가될 때 대상 행을 삭제하거나WHEN NOT MATCHED BY SOURCE
절을 update에 추가하면 많은 수의 대상 행이 수정될 수 있습니다. 최상의 성능을 위해, 업데이트되거나 삭제되는 대상 행의 수를 limit으로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
를 기준으로 원본 table 행과 일치하지 않는 대상 행에 대해WHEN NOT MATCHED BY SOURCE
조건 중 어느 것도 true로 평가되지 않으면, 해당 대상 행은 변경되지 않은 상태로 유지됩니다.
Important
원본 table 둘 이상의 행이 ON
및 WHEN MATCHED
절에 지정된 조건에 따라 대상 table 동일한 행과 일치하는 경우 MERGE
작업이 DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE 오류와 함께 실패합니다. 병합의 SQL 의미 체계에 따르면, 일치하는 대상 행을 update하기 위해 어떤 원본 행을 사용해야 하는지 명확하지 않기 때문에, 이러한 유형의 update 작업은 애매합니다. 소스 table를 전처리하여 여러 일치 항목이 발생할 가능성을 제거할 수 있습니다. 변경 데이터 캡처 예제를 참조하세요. 이 예제에서는 변경 내용을 대상 Delta table적용하기 전에 변경 데이터 세트(원본 데이터 세트)를 전처리하여 각 키에 대한 최신 변경 내용만 유지합니다. Databricks Runtime 15.4 LTS 이하 MERGE
에서는 여러 일치 항목을 평가하기 전에 절의 ON
조건만 고려합니다.
예제
복잡한 작업, 예를 들어 데이터 중복 제거, 변경 데이터 업서트, SCD 타입 2 작업 적용 등에
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