적용 대상: Databricks SQL
Databricks Runtime
원본 테이블을 기반으로 하는 업데이트, 삽입, 삭제 집합을 대상 델타 테이블에 병합합니다.
이 진술은 Delta Lake 테이블에 대해서만 지원됩니다.
이 페이지에는 명령과 함께 올바른 구문을 사용하는 방법에 대한 세부 정보가 포함되어 있습니다 MERGE
.
머지 (merge)를 사용하여 델타 레이크 테이블에 업서트하는 방법을 참고하여 MERGE
작업을 통해 데이터를 관리하는 방법에 대한 더 많은 지침을 확인하세요.
구문
[ common_table_expression ]
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 } } [, ...] }
매개 변수
-
CTE(공통 테이블 식)는 반복되는 계산을 방지하거나 복잡한 중첩 쿼리의 가독성을 개선하기 위해 주 쿼리 블록 내에서 여러 번 다시 사용할 수 있는 하나 이상의 명명된 쿼리입니다.
WITH SCHEMA EVOLUTION
적용 대상:
Databricks Runtime 15.2 이상
이 작업에 대해 자동 스키마 진화를 사용하도록 설정합니다. 사용하도록 설정하면 대상 델타 테이블의 스키마가 원본 테이블의 스키마와 일치하도록 자동으로 업데이트됩니다.
-
수정할 테이블을 식별하는 테이블 이름입니다. 참조되는 테이블은 델타 테이블이어야 합니다.
이름에 옵션 사양이 포함되어서는 안됩니다.
테이블은 외래 테이블이 아니어야 합니다.
-
대상 테이블의 테이블 별칭입니다. 별칭에는 열 목록이 포함되어서는 안 됩니다.
-
대상 테이블에 병합할 원본 테이블을 식별하는 테이블 이름입니다.
-
원본 테이블의 테이블 별칭입니다. 별칭에는 열 목록이 포함되어서는 안 됩니다.
-
한 관계의 행을 다른 관계의 행과 결합하는 방법입니다. 반환 형식이 BOOLEAN 데이터 타입인 식입니다.
WHEN MATCHED [ AND
일치된_조건]
WHEN MATCHED
절은merge_condition
및 선택적match_condition
을 기반으로 원본 행이 대상 테이블 행과 일치할 때 실행됩니다.일치하는_작업
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 오류를 반환합니다.WHEN MATCHED
과 일치하는 원본 및 대상 행 쌍에 대해merge_condition
조건 중 어느 것도 true로 평가되지 않으면 대상 행은 변경되지 않은 상태로 유지됩니다.WHEN NOT MATCHED [BY TARGET] [ AND
조건_일치_하지_않음]
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
은 대상 테이블의 열만 참조하는 부울 식이어야 합니다.소스 작업과 일치하지 않음
DELETE
대상 테이블 행을 삭제합니다.
UPDATE
대상 테이블 행을 업데이트합니다.
expr
는 대상 테이블의 열만 참조할 수 있습니다. 그렇지 않으면 쿼리가 분석 오류를 throw합니다.적용 대상:
Databricks SQL
Databricks Runtime 11.3 LTS 이상
DEFAULT
를expr
로 지정하여 명시적으로 열을 기본값으로 업데이트할 수 있습니다.
중요한
WHEN NOT MATCHED BY SOURCE
이 false로 평가될 때 대상 행을 업데이트하거나 삭제하는merge_condition
절을 추가하면 많은 수의 대상 행이 수정될 수 있습니다. 최상의 성능을 위해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라는 오류를 반환합니다.원본 테이블
WHEN NOT MATCHED BY SOURCE
의merge_condition
행과 일치하지 않는 대상 행에 대해 true로 평가되는 조건이 없는 경우 대상 행은 변경되지 않은 상태로 유지됩니다.
중요한
MERGE
에서는 여러 일치 항목을 평가하기 전에 절의 ON
조건만 고려합니다.
예제
데이터 중복 제거, 변경 데이터 업서트, SCD 타입 2 작업 적용 등과 같은 복잡한 작업에는 MERGE INTO
를 사용할 수 있습니다. 몇 가지 예시는 병합을 사용하여 Delta Lake 테이블에 업서트하기를 참조하세요.
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