MERGE INTO

S’applique à :case marquée oui Databricks SQL case marquée oui Databricks Runtime

Fusionne un ensemble de mises à jour, d’insertions et de suppressions basées sur une table source dans une table Delta cible.

Cette instruction n’est prise en charge que pour les tables Delta Lake.

Cette page contient des détails sur l’utilisation de la syntaxe correcte avec la commande MERGE. Consultez Upsert dans une table Delta Lake à l’aide de fusionner pour obtenir des conseils supplémentaires sur l’utilisation des opérations MERGE pour gérer vos données.

Syntaxe

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 } } [, ...] }

Paramètres

  • target_table_name

    Nom de table identifiant la table en cours de modification. La table référencée doit être une table Delta.

    La table ne doit pas être une table source contenant une clé étrangère.

  • target_alias

    Alias de table pour la table cible. L’alias ne doit pas inclure une liste de colonnes.

  • source_table_reference

    Nom de table identifiant la table source à fusionner dans la table cible.

  • source_alias

    Alias de table pour la table source. L’alias ne doit pas inclure une liste de colonnes.

  • ON merge_condition

    Comment les lignes d’une relation sont combinées avec les lignes d’une autre relation. Expression avec un type de retour booléen.

  • WHEN MATCHED [ AND matched_condition]

    Les clauses WHEN MATCHED sont exécutées lorsqu’une ligne source correspond à une ligne de table cible basée sur la merge_condition et la match_condition facultative.

  • matched_action

    • DELETE

      Supprime la ligne de table cible correspondante.

      Plusieurs correspondances sont autorisées lorsque des correspondances sont supprimées de manière inconditionnelle. Une suppression inconditionnelle n’est pas ambiguë, même s’il existe plusieurs correspondances.

    • UPDATE

      Met à jour la ligne de table cible correspondante.

      Pour mettre à jour toutes les colonnes de la table Delta cible avec les colonnes correspondantes du jeu de données source, utilisez UPDATE SET *. Cela équivaut à UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] pour toutes les colonnes de la table Delta cible. Par conséquent, cette action suppose que la table source possède les mêmes colonnes que celles de la table cible, sinon la requête génère une erreur d’analyse.

      Notes

      Ce comportement change lorsque la migration de schéma automatique est activée. Consultez Évolution automatique du schéma pour la fusion Delta Lake pour plus de détails.

      S’applique à : oui coché Databricks SQL coche marquée oui Databricks Runtime 11.2 et versions ultérieures

      Vous pouvez définir DEFAULT en tant que expr afin de mettre explicitement à jour la colonne sur sa valeur par défaut.

    S’il y a plusieurs clauses WHEN MATCHED, elles sont évaluées dans l’ordre dans lequel elles sont spécifiées. Chaque clause WHEN MATCHED, sauf la dernière, doit avoir un matched_condition. Sinon, la requête retourne une erreur NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION .

    Si aucune des conditions WHEN MATCHED ne prend la valeur true pour une paire de lignes source et cible qui correspond à la merge_condition, la ligne cible reste inchangée.

  • WHEN NOT MATCHED [BY TARGET] [ AND not_matched_condition]

    WHEN NOT MATCHED les clauses insèrent une ligne lorsqu’une ligne source ne correspond à aucune ligne cible en fonction des merge_condition et des not_matched_condition facultatifs.

    S’applique à :coche pour oui Databricks SQL coche pour oui Databricks Runtime 12.1 et versions ultérieures

    WHEN NOT MATCHED BY TARGET peut être utilisé comme alias pourWHEN NOT MATCHED.

    not_matched_condition doit être une expression booléenne.

    • INSERT *

      Insère toutes les colonnes de la table Delta cible avec les colonnes correspondantes du jeu de données source. Cela équivaut à INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) pour toutes les colonnes de la table Delta cible. Cette action nécessite que la table source comporte les mêmes colonnes que celles du tableau cible.

      Notes

      Ce comportement change lorsque la migration de schéma automatique est activée. Consultez Évolution automatique du schéma pour la fusion Delta Lake pour plus de détails.

    • INSERT ( ... ) VALUES ( ... )

      La nouvelle ligne est générée en fonction de la colonne spécifiée et des expressions correspondantes. Il n’est pas nécessaire de spécifier toutes les colonnes de la table cible. Pour les colonnes cibles non spécifiées, la valeur par défaut de la colonne est insérée ou NULL si aucune n’existe.

      S’applique à : oui coché Databricks SQL coche marquée oui Databricks Runtime 11.2 et versions ultérieures

      Vous pouvez spécifier DEFAULT comme expression pour insérer explicitement la colonne par défaut pour une colonne cible.

    S’il y a plusieurs clauses WHEN NOT MATCHED, elles sont évaluées dans l’ordre dans lequel elles sont spécifiées. Toutes les clauses WHEN NOT MATCHED, à l’exception de la dernière, doivent avoir des not_matched_condition. Sinon, la requête retourne une erreur NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION .

  • WHEN NOT MATCHED BY SOURCE [ AND not_matched_by_source_condition]

    S’applique à :coche pour oui Databricks SQL coche pour oui Databricks Runtime 12.1 et versions ultérieures

    WHEN NOT MATCHED BY SOURCE les clauses sont exécutées lorsqu’une ligne cible ne correspond à aucune ligne de la table source en fonction de merge_conditionet que le not_match_by_source_condition facultatif prend la valeur true.

    not_matched_by_source_condition doit être une expression booléenne qui référence uniquement les colonnes de la table cible.

  • not_matched_by_source_action

    • DELETE

      Supprime la ligne de table cible.

    • UPDATE

      Met à jour la ligne de table cible. expr peut uniquement référencer des colonnes de la table cible, sinon la requête génère une erreur d’analyse.

      S’applique à : oui coché Databricks SQL coche marquée oui Databricks Runtime 11.2 et versions ultérieures

      Vous pouvez définir DEFAULT en tant que expr afin de mettre explicitement à jour la colonne sur sa valeur par défaut.

    Important

    L’ajout d’une clause WHEN NOT MATCHED BY SOURCEpour mettre à jour ou supprimer des lignes cibles lorsque la valeur merge_conditionest false peut entraîner la modification d’un grand nombre de lignes cibles. Pour des performances optimales, appliquez desnot_matched_by_source_condition pour limiter le nombre de lignes cibles mises à jour ou supprimées.

    S’il y a plusieurs WHEN NOT MATCHED BY SOURCE clauses, elles sont évaluées dans l’ordre dans lequel elles sont spécifiées. Chaque clause WHEN NOT MATCHED BY SOURCE, sauf la dernière, doit avoir un not_matched_by_source_condition. Sinon, la requête retourne une erreur NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION .

    Si aucune des conditions WHEN NOT MATCHED BY SOURCEn’est évaluée à true pour une ligne cible qui ne correspond à aucune ligne de la table source en fonction de merge_condition, la ligne cible reste inchangée.

Important

Une opération MERGE peut échouer avec une erreur DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE si plusieurs lignes du jeu de données source correspondent et tentent de mettre à jour les mêmes lignes de la table Delta cible. Selon la sémantique SQL de la fusion, une telle opération de mise à jour est ambiguë car on ne sait pas quelle ligne source doit être utilisée pour mettre à jour la ligne cible correspondante. Vous pouvez prétraiter la table source pour éliminer le risque de correspondances multiples. Consultez l’exemple de capture de données modifiées : le jeu de données modifiées est prétraité (à savoir, le jeu de données source) pour ne conserver que la dernière modification pour chaque clé avant d’appliquer cette modification dans la table Delta cible.

Exemples

Vous pouvez utiliser MERGE INTO pour des opérations complexes telles que la déduplication des données, la modification des données d’upsert, l’application d’opérations de type 2, etc. Pour obtenir quelques exemples, consultez Upsert dans une table Delta Lake en utilisant la fusion.

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