MERGE INTO
Van toepassing op: Databricks SQL Databricks Runtime
Voegt een set updates, invoegingen en verwijderingen samen op basis van een brontabel in een doel-Delta-tabel.
Deze verklaring wordt alleen ondersteund voor Delta Lake-tabellen.
Deze pagina bevat details voor het gebruik van de juiste syntaxis met de MERGE
opdracht. Zie Upsert via een Delta Lake-tabel met merge voor meer informatie over het gebruik van MERGE
-operaties om uw gegevens te beheren.
Syntaxis
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 } } [, ...] }
Parameters
WITH SCHEMA EVOLUTION
Van toepassing op: Databricks Runtime 15.2 en hoger
Hiermee wordt automatische schemaontwikkeling voor deze
MERGE
bewerking ingeschakeld. Wanneer dit is ingeschakeld, wordt het schema van de delta-doeltabel automatisch bijgewerkt zodat deze overeenkomt met het schema van de brontabel.-
Een tabelnaam om de tabel te identificeren die wordt gewijzigd. De tabel waarnaar wordt verwezen, moet een Delta-tabel zijn.
De naam mag geen specificatie van opties bevatten.
De tabel mag geen vreemde tabel zijn.
-
Een Tabelalias voor de doeltabel. De alias mag geen kolomlijst bevatten.
-
Een tabelnaam die de brontabel identificeert en moet worden samengevoegd met de doeltabel.
-
Een Tabelalias voor de brontabel. De alias mag geen kolomlijst bevatten.
-
Hoe de rijen van de ene relatie worden gecombineerd met de rijen van een andere relatie. Een expressie met een retourtype booleaanse waarde.
WHEN MATCHED [ AND
matched_condition]
WHEN MATCHED
clausules worden uitgevoerd wanneer een bronrij overeenkomt met een rij in de doeltabel op basis van demerge_condition
en de optionelematch_condition
.matched_action
DELETE
Hiermee verwijdert u de overeenkomende rij van de doeltabel.
Meerdere overeenkomsten zijn toegestaan wanneer overeenkomsten onvoorwaardelijke verwijdering worden uitgevoerd. Een onvoorwaardelijke verwijdering is niet dubbelzinnig, zelfs als er meerdere overeenkomsten zijn.
UPDATE
Hiermee wordt de overeenkomende rij van de doeltabel bijgewerkt.
Als u alle kolommen van de doel-Delta-tabel wilt bijwerken met de bijbehorende kolommen van de brongegevensset, gebruikt u
UPDATE SET *
. Dit komt overeen metUPDATE SET col1 = source.col1 [, col2 = source.col2 ...]
voor alle kolommen van de doel-Delta-tabel. Daarom wordt bij deze actie ervan uitgegaan dat de brontabel dezelfde kolommen heeft als die in de doeltabel, anders genereert de query een analysefout.Notitie
Dit gedrag verandert wanneer automatische schemaontwikkeling is ingeschakeld. Zie Automatische schemaontwikkeling voor Delta Lake-samenvoeging voor meer informatie.
Van toepassing op: Databricks SQL Databricks Runtime 11.3 LTS en hoger
U kunt
DEFAULT
opgeven alsexpr
om de kolom expliciet bij te werken naar de standaardwaarde.
Als er meerdere
WHEN MATCHED
componenten zijn, worden ze geëvalueerd in de volgorde waarin ze zijn opgegeven. ElkeWHEN MATCHED
component, met uitzondering van de laatste, moet eenmatched_condition
. Anders retourneert de query een NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION-fout .Als geen van de
WHEN MATCHED
voorwaarden waar is voor een bron- en doelrijpaar dat overeenkomt met demerge_condition
voorwaarden, blijft de doelrij ongewijzigd.WHEN NOT MATCHED [BY TARGET] [ AND
not_matched_condition]
WHEN NOT MATCHED
-clausules voegen een rij in wanneer een bronrij niet overeenkomt met een doelrij op basis van demerge_condition
en de optionelenot_matched_condition
.Van toepassing op: Databricks SQL Databricks Runtime 12.2 LTS en hoger
WHEN NOT MATCHED BY TARGET
kan worden gebruikt als alias voorWHEN NOT MATCHED
.not_matched_condition
moet een Boole-expressie zijn.INSERT *
Hiermee worden alle kolommen van de doel-Delta-tabel ingevoegd met de bijbehorende kolommen van de brongegevensset. Dit komt overeen met
INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...])
voor alle kolommen van de Delta-doeltabel. Deze actie vereist dat de brontabel dezelfde kolommen heeft als die in de doeltabel.Notitie
Dit gedrag verandert wanneer automatische schemaontwikkeling is ingeschakeld. Zie Automatische schemaontwikkeling voor Delta Lake-samenvoeging voor meer informatie.
INSERT ( ... ) VALUES ( ... )
De nieuwe rij wordt gegenereerd op basis van de opgegeven kolom en bijbehorende expressies. Alle kolommen in de doeltabel hoeven niet te worden opgegeven. Voor niet-opgegeven doelkolommen wordt de standaardkolom ingevoegd of
NULL
als er geen bestaat.Van toepassing op: Databricks SQL Databricks Runtime 11.3 LTS en hoger
U kunt
DEFAULT
opgeven als een expressie om expliciet de standaardkolom voor een doelkolom in te voegen.
Als er meerdere
WHEN NOT MATCHED
componenten zijn, worden ze geëvalueerd in de volgorde waarin ze zijn opgegeven. AlleWHEN NOT MATCHED
componenten, met uitzondering van de laatste, moeten s hebbennot_matched_condition
. Anders retourneert de query een NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION fout.WHEN NOT MATCHED BY SOURCE [ AND
not_matched_by_source_condition]
Van toepassing op: Databricks SQL Databricks Runtime 12.2 LTS en hoger
WHEN NOT MATCHED BY SOURCE
componenten worden uitgevoerd wanneer een doelrij niet overeenkomt met rijen in de brontabel op basis van demerge_condition
en de optionelenot_match_by_source_condition
resulteert in waar.not_matched_by_source_condition
moet een Boole-expressie zijn die alleen verwijst naar kolommen uit de doeltabel.not_matched_by_source_action
DELETE
Hiermee verwijdert u een rij uit de doeltabel.
UPDATE
Hiermee wordt de rij van de doeltabel bijgewerkt.
expr
mag alleen verwijzen naar kolommen uit de doeltabel, anders genereert de query een analysefout.Van toepassing op: Databricks SQL Databricks Runtime 11.3 LTS en hoger
U kunt
DEFAULT
opgeven alsexpr
om de kolom expliciet bij te werken naar de standaardwaarde.
Belangrijk
Als u een
WHEN NOT MATCHED BY SOURCE
component toevoegt om doelrijen bij te werken of te verwijderen wanneer demerge_condition
resulteert in onwaar, kan dit ertoe leiden dat een groot aantal doelrijen wordt gewijzigd. Voor de beste prestaties past unot_matched_by_source_condition
s toe om het aantal bijgewerkte of verwijderde doelrijen te beperken.Als er meerdere
WHEN NOT MATCHED BY SOURCE clauses
zijn, worden ze geëvalueerd in de volgorde waarin ze zijn opgegeven. ElkeWHEN NOT MATCHED BY SOURCE
component, met uitzondering van de laatste, moet eennot_matched_by_source_condition
. Anders retourneert de query een NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION fout.Als geen van de
WHEN NOT MATCHED BY SOURCE
voorwaarden als waar worden geëvalueerd voor een doelrij die niet overeenkomt met enige rij in de brontabel, op basis van demerge_condition
, blijft de doelrij ongewijzigd.
Belangrijk
MERGE
-bewerkingen mislukken met een DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE-fout als meer dan één rij in de brontabel overeenkomt met dezelfde rij in de doeltabel op basis van de voorwaarden die zijn opgegeven in de ON
- en WHEN MATCHED
-clausules. Volgens de SQL-semantiek van samenvoegen is dit type updatebewerking dubbelzinnig omdat het onduidelijk is welke bronrij moet worden gebruikt om de overeenkomende doelrij bij te werken. U kunt de brontabel vooraf verwerken om de mogelijkheid van meerdere overeenkomende resultaten te elimineren. Zie het voorbeeld van het vastleggen van wijzigingengegevens. In dit voorbeeld wordt de wijzigingsgegevensset (de brongegevensset) vooraf verwerkt om alleen de meest recente wijziging voor elke sleutel te behouden voordat deze wijziging in de doel-Delta-tabel wordt toegepast. In Databricks Runtime 15.4 LTS en hieronder worden MERGE
alleen voorwaarden in de ON
component in overweging nemen voordat meerdere overeenkomsten worden geëvalueerd.
Voorbeelden
U kunt MERGE INTO
gebruiken voor complexe bewerkingen, zoals het dedupliceren van data, upsert van wijzigingsdata, het toepassen van SCD Type 2-bewerkingen, enzovoort. Zie Upsert in een Delta Lake-tabel met behulp van merge voor enkele voorbeelden.
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