MERGE INTO

Dotyczy:check marked yes Databricks SQL check marked yes Databricks Runtime

Scala zestaw aktualizacji, wstawiania i usuwania na podstawie tabeli źródłowej do docelowej tabeli delty.

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 into a Delta Lake table using merge (Upsert into a Delta Lake table using merge ), aby uzyskać więcej wskazówek dotyczących sposobu używania MERGE operacji do zarządzania danymi.

Składnia

MERGE 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

  • target_table_name

    Nazwa tabeli identyfikującej modyfikowaną tabelę. Tabela, do których odwołuje się odwołanie, musi być tabelą delty.

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

  • target_alias

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

  • source_table_reference

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

  • source_alias

    Alias 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 jest zgodny z docelowym wierszem tabeli na merge_condition podstawie elementu i opcjonalnego 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

      Aktualizacje dopasowanego wiersza tabeli docelowej.

      Aby zaktualizować wszystkie kolumny docelowej tabeli delty z odpowiednimi kolumnami źródłowego zestawu danych, użyj polecenia 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ę po włączeniu automatycznej migracji schematu. Aby uzyskać szczegółowe informacje, zobacz Automatyczna ewolucja schematu dla scalania usługi Delta Lake.

      Dotyczy:check marked yes Databricks SQL Warehouse w wersji 2022.35 lub nowszej check marked yes databricks Runtime 11.2 lub nowszej

      Można określić DEFAULT , aby expr 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]

    WHEN NOT MATCHED Klauzule wstawia wiersz, gdy wiersz źródłowy nie jest zgodny z żadnym wierszem docelowym na merge_condition podstawie elementu i opcjonalnego not_matched_condition.

    Dotyczy:check marked yes Databricks SQL check marked yes Databricks Runtime 12.1 lub nowszy

    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ę po włączeniu automatycznej migracji schematu. Aby uzyskać szczegółowe informacje, zobacz Automatyczna ewolucja schematu dla scalania usługi 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:check marked yes Databricks SQL Warehouse w wersji 2022.35 lub nowszej check marked yes databricks Runtime 11.2 lub nowszej

      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:check marked yes Databricks SQL check marked yes Databricks Runtime 12.1 lub nowszy

    WHEN NOT MATCHED BY SOURCE Klauzule są wykonywane, gdy wiersz docelowy nie jest zgodny z żadnymi wierszami w tabeli źródłowej na merge_condition podstawie elementu , a opcjonalna not_match_by_source_condition wartość 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 docelowy wiersz tabeli.

    • UPDATE

      Aktualizacje 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:check marked yes Databricks SQL Warehouse w wersji 2022.35 lub nowszej check marked yes databricks Runtime 11.2 lub nowszej

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

    Ważne

    WHEN NOT MATCHED BY SOURCE Dodanie klauzuli w celu zaktualizowania lub usunięcia wierszy docelowych, gdy merge_condition wynikiem jest fałsz, może prowadzić do modyfikacji dużej liczby wierszy docelowych. Aby uzyskać najlepszą wydajność, zastosuj s not_matched_by_source_condition, 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 WHEN NOT MATCHED BY SOURCE warunków nie ma wartości true dla wiersza docelowego, który nie pasuje do żadnych wierszy w tabeli źródłowej na merge_conditionpodstawie , wiersz docelowy pozostanie niezmieniony.

Ważne

MERGE Operacja może zakończyć się niepowodzeniem z powodu błędu DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE, jeśli wiele wierszy źródłowego zestawu danych pasuje i spróbuje zaktualizować te same wiersze docelowej tabeli delty. Według semantyki SQL scalania taka operacja aktualizacji jest niejednoznaczna, 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 — wstępnie przetwarza zestaw danych zmian (czyli źródłowy zestaw danych), aby zachować tylko najnowszą zmianę dla każdego klucza przed zastosowaniem tej zmiany do docelowej tabeli delty.

Przykłady

Można użyć MERGE INTO w przypadku złożonych operacji, takich jak deduplikacja danych, upsertowanie danych zmian, stosowanie operacji typu 2 scD itp. Zapoznaj się z tematem Upsert into a Delta Lake table using merge (Upsert into a Delta Lake table using merge ), 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