MERGE INTO
Dotyczy: Databricks SQL 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: 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.-
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ą.
-
Alias tabeli dla tabeli docelowej. Alias nie może zawierać listy kolumn.
-
Nazwa tabeli identyfikująca tabelę źródłową do scalenia z tabelą docelową.
-
Alias tabeli dla 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 pasuje do wiersza tabeli docelowej na podstawiemerge_condition
i opcjonalnejmatch_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 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 w Delta Lake.
Dotyczy: Databricks SQL Databricks Runtime 11.3 LTS i nowsze
Możesz określić
DEFAULT
jakoexpr
, 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 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]
Klauzule
WHEN NOT MATCHED
wstawią wiersz, gdy wiersz źródłowy nie pasuje do żadnego z wierszy docelowych na podstawiemerge_condition
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 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: 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 pasuje do żadnych wierszy w tabeli źródłowej na podstawiemerge_condition
, a opcjonalnanot_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: Databricks SQL Databricks Runtime 11.3 LTS i nowsze
Możesz określić
DEFAULT
jakoexpr
, 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, gdymerge_condition
zwróci wartość false, może prowadzić do modyfikacji dużej liczby wierszy docelowych. Aby uzyskać najlepszą wydajność, zastosujnot_matched_by_source_condition
s, 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 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 podstawiemerge_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