Udostępnij za pośrednictwem


MERGE INTO

Dotyczy:zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak Databricks Runtime

Scalaj zestaw aktualizacji, wstawek i usunięć na podstawie tabeli źródłowej z docelową tabelą Delta.

Ta instrukcja jest obsługiwana tylko w przypadku tabel usługi Delta Lake.

Ta strona zawiera szczegóły dotyczące używania poprawnej składni z poleceniem MERGE . Zobacz Upsert w tabeli usługi Delta Lake przy użyciu scalania, aby uzyskać więcej wskazówek dotyczących sposobu używania operacji MERGE do zarządzania danymi.

Składnia

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 } } [, ...] }

Parametry

  • WITH SCHEMA EVOLUTION

    Dotyczy:zaznacz pole wyboru oznaczone jako tak Databricks Runtime 15.2 i nowsze

    Umożliwia automatyczną ewolucję schematu dla tej operacji MERGE. Po włączeniu schemat docelowej tabeli delty jest automatycznie aktualizowany w celu dopasowania do schematu tabeli źródłowej.

  • target_table_name

    Nazwa tabeli , identyfikująca modyfikowaną tabelę. Tabela, do której się odwołano, musi być tabelą Delta.

    Nazwa nie może zawierać specyfikacji opcji.

    Tabela nie może być tabelą obcą.

  • target_alias

    Alias tabeli dla tabeli docelowej. Alias nie może zawierać listy kolumn.

  • source_table_reference

    Nazwa tabeli identyfikująca tabelę źródłową do scalenia z tabelą docelową.

  • source_alias

    Alias tabeli dla tabeli źródłowej. Alias nie może zawierać listy kolumn.

  • ON merge_condition

    Sposób łączenia wierszy z jednej relacji z wierszami innej relacji. Wyrażenie z zwracanym typem wartości logicznej.

  • WHEN MATCHED [ AND matched_condition]

    WHEN MATCHED klauzule są wykonywane, gdy wiersz źródłowy pasuje do wiersza tabeli docelowej na podstawie merge_condition i opcjonalnej match_condition.

  • matched_action

    • DELETE

      Usuwa pasujący wiersz tabeli docelowej.

      Wiele dopasowań jest dozwolonych, gdy dopasowania są bezwarunkowo usuwane. Usuwanie bezwarunkowe nie jest niejednoznaczne, nawet jeśli istnieje wiele dopasowań.

    • UPDATE

      Aktualizuje dopasowany wiersz tabeli docelowej.

      Aby zaktualizować wszystkie kolumny docelowej tabeli delty z odpowiednimi kolumnami źródłowego zestawu danych, użyj UPDATE SET *. Jest to odpowiednik UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] dla wszystkich kolumn docelowej tabeli delty. W związku z tym ta akcja zakłada, że tabela źródłowa ma te same kolumny co w tabeli docelowej. W przeciwnym razie zapytanie zgłosi błąd analizy.

      Uwaga

      To zachowanie zmienia się, gdy włączono automatyczną ewolucję schematu. Aby uzyskać szczegółowe informacje, zobacz Automatyczna ewolucja schematu dla scalania w Delta Lake.

      Dotyczy:zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak Databricks Runtime 11.3 LTS i nowsze

      Możesz określić DEFAULT jako expr, aby jawnie zaktualizować kolumnę do jej wartości domyślnej.

    Jeśli istnieje wiele WHEN MATCHED klauzul, są one oceniane w kolejności, w której są określone. Każda klauzula WHEN MATCHED , z wyjątkiem ostatniego, musi mieć wartość matched_condition. W przeciwnym razie zapytanie zwraca błąd NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION .

    Jeśli żadna z WHEN MATCHED warunków nie zwróci wartości true dla pary wierszy źródłowych i docelowych pasujących merge_conditiondo , wiersz docelowy pozostanie niezmieniony.

  • WHEN NOT MATCHED [BY TARGET] [ AND not_matched_condition]

    Klauzule WHEN NOT MATCHED wstawią wiersz, gdy wiersz źródłowy nie pasuje do żadnego z wierszy docelowych na podstawie merge_condition i opcjonalnego not_matched_condition.

    Dotyczy:zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak Databricks Runtime 12.2 LTS i nowsze

    WHEN NOT MATCHED BY TARGET można użyć jako aliasu dla elementu WHEN NOT MATCHED.

    not_matched_condition musi być wyrażeniem logicznym.

    • INSERT *

      Wstawia wszystkie kolumny docelowej tabeli delty z odpowiednimi kolumnami źródłowego zestawu danych. Jest to odpowiednik INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) dla wszystkich kolumn docelowej tabeli delty. Ta akcja wymaga, aby tabela źródłowa zawierała te same kolumny co w tabeli docelowej.

      Uwaga

      To zachowanie zmienia się, gdy włączono automatyczną ewolucję schematu. Aby uzyskać szczegółowe informacje, zobacz Automatyczna ewolucja schematu w trybie scalania Delta Lake.

    • INSERT ( ... ) VALUES ( ... )

      Nowy wiersz jest generowany na podstawie określonej kolumny i odpowiednich wyrażeń. Nie trzeba określać wszystkich kolumn w tabeli docelowej. W przypadku nieokreślonych kolumn docelowych zostanie wstawiona wartość domyślna kolumny lub NULL, jeśli żadna z nich nie istnieje.

      Dotyczy:zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak Databricks Runtime 11.3 LTS i nowsze

      Możesz określić DEFAULT jako wyrażenie, aby jawnie wstawić domyślną kolumnę dla kolumny docelowej.

    Jeśli istnieje wiele WHEN NOT MATCHED klauzul, są one oceniane w kolejności, w której są określone. Wszystkie WHEN NOT MATCHED klauzule, z wyjątkiem ostatniego, muszą mieć not_matched_conditions. W przeciwnym razie zapytanie zwraca błąd NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION .

  • WHEN NOT MATCHED BY SOURCE [ AND not_matched_by_source_condition]

    Dotyczy:zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak Databricks Runtime 12.2 LTS i nowsze

    WHEN NOT MATCHED BY SOURCE klauzule są wykonywane, gdy wiersz docelowy nie pasuje do żadnych wierszy w tabeli źródłowej na podstawie merge_condition, a opcjonalna not_match_by_source_condition daje wartość true.

    not_matched_by_source_condition musi być wyrażeniem logicznym, które odwołuje się tylko do kolumn z tabeli docelowej.

  • not_matched_by_source_action

    • DELETE

      Usuwa wiersz docelowej tabeli.

    • UPDATE

      Aktualizuje docelowy wiersz tabeli. expr może odwoływać się tylko do kolumn z tabeli docelowej, w przeciwnym razie zapytanie zgłosi błąd analizy.

      Dotyczy:zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak Databricks Runtime 11.3 LTS i nowsze

      Możesz określić DEFAULT jako expr, aby jawnie zaktualizować kolumnę do jej wartości domyślnej.

    Ważne

    Dodanie klauzuli WHEN NOT MATCHED BY SOURCE w celu zaktualizowania lub usunięcia wierszy docelowych, gdy merge_condition zwróci wartość false, może prowadzić do modyfikacji dużej liczby wierszy docelowych. Aby uzyskać najlepszą wydajność, zastosuj not_matched_by_source_conditions, aby ograniczyć liczbę wierszy docelowych zaktualizowanych lub usuniętych.

    Jeśli istnieje wiele WHEN NOT MATCHED BY SOURCE clauseswartości , zostaną one ocenione w kolejności, w której zostały określone. Każda klauzula WHEN NOT MATCHED BY SOURCE , z wyjątkiem ostatniego, musi mieć wartość not_matched_by_source_condition. W przeciwnym razie zapytanie zwraca błąd NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION .

    Jeśli żaden z warunków WHEN NOT MATCHED BY SOURCE nie zwróci wartości true dla wiersza docelowego, który nie pasuje do żadnych wierszy w tabeli źródłowej na podstawie merge_condition, wiersz docelowy pozostanie niezmieniony.

Ważne

Operacje MERGE kończą się niepowodzeniem z błędem DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE, jeśli więcej niż jeden wiersz w tabeli źródłowej pasuje do tego samego wiersza w tabeli docelowej na podstawie warunków określonych w klauzulach ON i WHEN MATCHED. Według semantyki SQL scalania ten typ operacji aktualizacji jest niejednoznaczny, ponieważ nie jest jasne, który wiersz źródłowy powinien być używany do aktualizowania dopasowanego wiersza docelowego. Możesz wstępnie przetworzyć tabelę źródłową, aby wyeliminować możliwość wielu dopasowań. Zobacz przykład przechwytywania zmian danych. W tym przykładzie wstępnie przetworzymy zestaw danych zmiany (źródłowy zestaw danych), aby zachować tylko najnowszą zmianę dla każdego klucza przed zastosowaniem tej zmiany do docelowej tabeli delty. W środowisku Databricks Runtime 15.4 LTS i poniżej MERGE uwzględnia tylko warunki w klauzuli ON przed oceną wielu dopasowań.

Przykłady

Można użyć MERGE INTO do złożonych operacji, takich jak deduplikacja danych, upsertowanie danych zmiany, zastosowanie operacji typu SCD Type 2 itp. Zobacz Upsert do tabeli Delta Lake przy użyciu scalania, aby zapoznać się z kilkoma przykładami.

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