다음을 통해 공유


MERGE INTO

적용 대상:예로 표시된 확인 Databricks SQL 예로 표시된 확인 Databricks Runtime

업데이트, 삽입 및 삭제 set을 원본 table에 기반하여 대상 델타 table로 병합합니다.

이 문장은 Delta Lake tables만 지원됩니다.

이 페이지에는 명령과 함께 올바른 구문을 사용하는 방법에 대한 세부 정보가 포함되어 있습니다 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 } } [, ...] }

Parameters

  • WITH SCHEMA EVOLUTION

    적용 대상:예로 표시된 확인 Databricks Runtime 15.2 이상

    MERGE 작업에 대해 자동 schema 진화 사용하도록 설정합니다. 사용하도록 설정하면 대상 Delta table의 schema은 원본 table의 schema와 일치하도록 자동으로 업데이트됩니다.

  • target_table_name

    수정할 table 식별하는 Table 이름. 참조된 table는 반드시 델타 table이어야 합니다.

    이름에 옵션 사양포함되어서는 안됩니다.

    table은 외국의 table이 되어서는 안 됩니다.

  • target_alias

    대상 table의 Table 별칭. 별칭에는 columnlist포함하면 안 됩니다.

  • source_table_reference

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

  • source_alias

    원본 table에 대한 Table 별칭. 별칭에는 columnlist포함하면 안 됩니다.

  • ON merge_condition

    한 관계의 행을 다른 관계의 행과 결합하는 방법입니다. 반환 형식이 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 기본값으로 명시적으로 updateDEFAULTexpr 지정할 수 있습니다.

    여러 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 TARGETWHEN 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 둘 이상의 행이 ONWHEN 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 작업 적용 등에 을 사용할 수 있습니다. 몇 가지 예시는 병합을 사용하여 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