다음을 통해 공유


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 작업에 대해 자동 스키마 진화를 사용하도록 설정합니다. 사용하도록 설정하면 대상 델타 테이블의 스키마가 원본 테이블의 스키마와 일치하도록 자동으로 업데이트됩니다.

  • target_table_name

    수정할 테이블을 식별하는 테이블 이름입니다. 참조되는 테이블은 델타 테이블이어야 합니다.

    테이블은 외세의 테이블이 아니어야 합니다.

  • target_alias

    대상 테이블의 테이블 별칭입니다. 별칭에 열 목록을 포함하면 안 됩니다.

  • source_table_reference

    대상 테이블에 병합할 원본 테이블을 식별하는 테이블 이름입니다.

  • source_alias

    원본 테이블의 테이블 별칭입니다. 별칭에 열 목록을 포함하면 안 됩니다.

  • ON merge_condition

    한 관계의 행을 다른 관계의 행과 결합하는 방법입니다. 반환 형식이 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 이상

      DEFAULTexpr로 지정하여 명시적으로 열을 기본값으로 업데이트할 수 있습니다.

    여러 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 TARGETWHEN 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 이상

      DEFAULTexpr로 지정하여 명시적으로 열을 기본값으로 업데이트할 수 있습니다.

    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