Delen via


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 [ 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: vinkje als ja aan 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.

  • 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 tabelalias voor 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 schemaontwikkeling 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 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: 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

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