MERGE INTO

Van toepassing op:vinkje als ja aan Databricks SQL vinkje als ja aan 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 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

  • target_table_name

    Een tabelnaam waarmee de tabel wordt geïdentificeerd die wordt gewijzigd. De tabel waarnaar wordt verwezen, moet een Delta-tabel zijn.

    De tabel mag geen refererende tabel zijn.

  • target_alias

    Een tabelaliasvoor de doeltabel. De alias mag geen kolomlijst bevatten.

  • source_table_reference

    Een tabelnaam die de brontabel identificeert die moet worden samengevoegd in de doeltabel.

  • source_alias

    Een tabelalias voor de brontabel. De alias mag geen kolomlijst bevatten.

  • OP merge_condition

    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 de merge_condition en de optionele match_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 met UPDATE 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 schemamigratie is ingeschakeld. Zie Automatische schemaontwikkeling voor Delta Lake-samenvoeging voor meer informatie.

      Van toepassing op:vinkje als ja aan Databricks SQL vinkje als ja aan Databricks Runtime 11.3 LTS en hoger

      U kunt opgeven DEFAULT of expr 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. Elke WHEN MATCHED component, met uitzondering van de laatste, moet een matched_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 de merge_conditionvoorwaarden, 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 de merge_condition en de optionele not_matched_condition.

    Van toepassing op:vinkje als ja aan Databricks SQL vinkje als ja aan Databricks Runtime 12.2 LTS en hoger

    WHEN NOT MATCHED BY TARGET kan worden gebruikt als alias voor WHEN 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 schemamigratie 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:vinkje als ja aan Databricks SQL vinkje als ja aan 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. Alle WHEN NOT MATCHED componenten, met uitzondering van de laatste, moeten s hebben not_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:vinkje als ja aan Databricks SQL vinkje als ja aan 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 de merge_condition en de optionele not_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:vinkje als ja aan Databricks SQL vinkje als ja aan Databricks Runtime 11.3 LTS en hoger

      U kunt opgeven DEFAULT of expr 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 onwaar merge_condition wordt geëvalueerd, kan dit ertoe leiden dat een groot aantal doelrijen wordt gewijzigd. Voor de beste prestaties past u s toe not_matched_by_source_conditionom het aantal bijgewerkte of verwijderde doelrijen te beperken.

    Als er meerdere WHEN NOT MATCHED BY SOURCE clauseszijn, worden ze geëvalueerd in de volgorde waarin ze zijn opgegeven. Elke WHEN NOT MATCHED BY SOURCE component, met uitzondering van de laatste, moet een not_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 de merge_condition, blijft de doelrij ongewijzigd.

Belangrijk

Een MERGE bewerking kan mislukken met een DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE fout als meerdere rijen van de brongegevensset overeenkomen en proberen dezelfde rijen van de doel-Delta-tabel bij te werken. Volgens de SQL-semantiek van samenvoegen is een dergelijke 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. Hiermee wordt de wijzigingsgegevensset (dat wil gezegd 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.

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