Udostępnij za pośrednictwem


MERGE INTO

Dotyczy: zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak 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 [ 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 MERGE operacji. 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ącej modyfikowaną tabelę. Tabela, do których odwołuje się odwołanie, musi być tabelą delty.

    Nazwa nie może zawierać specyfikacji opcji.

    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

      Aktualizuje dopasowany wiersz 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ę, gdy włączono automatyczną ewolucję schematu. Aby uzyskać szczegółowe informacje, zobacz Automatyczna ewolucja schematu dla scalania usługi 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ż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: 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 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: 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 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

      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ż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 operacje kończą się niepowodzeniem z powodu błędu 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 ON klauzulach 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 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

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