MERGE INTO
Dotyczy: Databricks SQL 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: 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.-
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ą.
-
Alias tabeli docelowej. Alias nie może zawierać listy kolumn.
-
Nazwa tabeli identyfikującej tabelę źródłową do scalenia z tabelą docelową.
-
Alias tabeli źródłowej. Alias nie może zawierać listy kolumn.
-
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 namerge_condition
podstawie elementu i opcjonalnegomatch_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 odpowiednikUPDATE 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: Databricks SQL Databricks Runtime 11.3 LTS i nowsze
Można określić
DEFAULT
, abyexpr
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 klauzulaWHEN 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ącychmerge_condition
do , 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 namerge_condition
podstawie elementu i opcjonalnegonot_matched_condition
.Dotyczy: Databricks SQL Databricks Runtime 12.2 LTS i nowsze
WHEN NOT MATCHED BY TARGET
można użyć jako aliasu dla elementuWHEN 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: Databricks SQL 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. WszystkieWHEN NOT MATCHED
klauzule, z wyjątkiem ostatniego, muszą miećnot_matched_condition
s. 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: Databricks SQL 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 namerge_condition
podstawie elementu , a opcjonalnanot_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: Databricks SQL Databricks Runtime 11.3 LTS i nowsze
Można określić
DEFAULT
, abyexpr
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, gdymerge_condition
wynikiem jest fałsz, może prowadzić do modyfikacji dużej liczby wierszy docelowych. Aby uzyskać najlepszą wydajność, zastosuj snot_matched_by_source_condition
, aby ograniczyć liczbę wierszy docelowych zaktualizowanych lub usuniętych.Jeśli istnieje wiele
WHEN NOT MATCHED BY SOURCE clauses
wartości , zostaną one ocenione w kolejności, w której zostały określone. Każda klauzulaWHEN 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 namerge_condition
podstawie , 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