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 instructie wordt alleen ondersteund voor Delta Lake-tabellen.
Deze pagina bevat details voor het gebruik van de juiste syntaxis met de MERGE
opdracht. Zie Upsert in een Delta Lake-tabel met behulp van samenvoegen voor meer informatie over het gebruik MERGE
van bewerkingen voor het beheren van uw gegevens.
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
Maakt automatische schemaontwikkeling mogelijk voor deze
MERGE
bewerking. Wanneer dit is ingeschakeld, wordt het schema van de delta-doeltabel automatisch bijgewerkt zodat deze overeenkomt met het schema van de brontabel.-
Een tabelnaam waarmee de tabel wordt geïdentificeerd 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 refererende tabel zijn.
-
Een tabelalias voor de doeltabel. De alias mag geen kolomlijst bevatten.
-
Een tabelnaam die de brontabel identificeert die moet worden samengevoegd in 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
componenten worden uitgevoerd wanneer een bronrij overeenkomt met een doeltabelrij 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 ...]
alle kolommen van de delta-doeltabel. 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 opgeven
DEFAULT
ofexpr
de kolom expliciet moet worden bijgewerkt 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
met componenten wordt een rij ingevoegd 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 ...])
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 opgeven
DEFAULT
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
waarde 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 de rij van de doeltabel.
UPDATE
Hiermee wordt de rij van de doeltabel bijgewerkt.
expr
kan 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 opgeven
DEFAULT
ofexpr
de kolom expliciet moet worden bijgewerkt naar de standaardwaarde.
Belangrijk
Als u een
WHEN NOT MATCHED BY SOURCE
component toevoegt om doelrijen bij te werken of te verwijderen wanneer onwaarmerge_condition
wordt geëvalueerd, kan dit ertoe leiden dat een groot aantal doelrijen wordt gewijzigd. Voor de beste prestaties past u s toenot_matched_by_source_condition
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 waar is voor een doelrij die niet overeenkomt met rijen 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
componenten. 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 overeenkomsten 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 ontdubbelen van gegevens, het upserteren van wijzigingsgegevens, het toepassen van SCD Type 2-bewerkingen, enzovoort. Zie Upsert in een Delta Lake-tabel met behulp van samenvoegen 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