MERGE INTO

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

Cette instruction est prise en charge uniquement pour les tables delta Lake.

Syntaxe

MERGE INTO target_table_name [target_alias]
   USING source_table_reference [source_alias]
   ON merge_condition
   [ WHEN MATCHED [ AND condition ] THEN matched_action ] [...]
   [ WHEN NOT MATCHED [ AND condition ]  THEN not_matched_action ] [...]

matched_action
 { DELETE |
   UPDATE SET * |
   UPDATE SET { column1 = value1 } [, ...] }

not_matched_action
 { INSERT * |
   INSERT (column1 [, ...] ) VALUES (value1 [, ...])

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.

  • target_alias

    Alias de tablepour 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.

  • 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.

  • condition

    Expression booléenne qui doit être true conforme à la WHEN MATCHED clause ou WHEN NOT MATCHED .

  • matched_action

    Il peut y avoir un nombre quelconque de WHEN MATCHEDWHEN NOT MATCHED clauses and chacune, mais au moins une clause est requise. Plusieurs correspondances sont autorisées lorsque les correspondances sont supprimées de manière non conditionnelle (car la suppression inconditionnelle n’est pas ambiguë, même si plusieurs correspondances sont trouvées).

    • WHEN MATCHED les clauses sont exécutées lorsqu’une ligne source correspond à une ligne de table cible basée sur la condition de correspondance. Ces clauses ont la sémantique suivante.

    • WHEN MATCHED les clauses ne peuvent avoir qu’une seule UPDATE et unique DELETE action. L' UPDATE action dans merge met à jour uniquement les colonnes spécifiées de la ligne cible correspondante. L' DELETE action va supprimer la ligne correspondante.

    • Chaque WHEN MATCHED clause peut avoir une condition facultative. Si cette condition de clause existe, UPDATE l' DELETE action ou est exécutée pour toute ligne de paire de lignes cible source correspondante uniquement lorsque la condition de clause a la valeur true.

    • S’il y a plusieurs WHEN MATCHED clauses, elles sont évaluées dans l’ordre dans lequel elles sont spécifiées (autrement dit, l’ordre des clauses). Toutes les WHEN MATCHED clauses, à l’exception de la dernière, doivent avoir des conditions.

    • Si les deux WHEN MATCHED clauses comportent des conditions et qu’aucune des conditions n’est remplie pour une paire de lignes source-cible correspondante, la ligne cible correspondante reste inchangée.

    • 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 a les mêmes colonnes que celles de la table cible, sinon la requête génère une erreur d’analyse.

      Ce comportement change lorsque la migration de schéma automatique est activée. Pour plus d’informations, consultez évolution automatique du schéma .

  • WHEN NOT MATCHED les clauses sont exécutées lorsqu’une ligne source ne correspond à aucune ligne cible basée sur la condition de correspondance. Ces clauses ont la sémantique suivante.

    • WHEN NOT MATCHED les clauses peuvent uniquement avoir l' INSERT action. 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, NULL est inséré.

    • Chaque WHEN NOT MATCHED clause peut avoir une condition facultative. Si la condition de clause est présente, une ligne source est insérée uniquement si cette condition est vraie pour cette ligne. Dans le cas contraire, la colonne source est ignorée.

    • S’il y a plusieurs WHEN NOT MATCHED clauses, elles sont évaluées dans l’ordre dans lequel elles sont spécifiées (autrement dit, l’ordre des clauses). Toutes les WHEN NOT MATCHED clauses, à l’exception de la dernière, doivent avoir des conditions.

    • Pour insérer toutes les colonnes de la table Delta cible avec les colonnes correspondantes du jeu de données source, utilisez INSERT * . Cela équivaut à INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) pour toutes les colonnes de la table Delta cible. Par conséquent, cette action suppose que la table source a 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. Pour plus d’informations, consultez évolution automatique du schéma .

Important

Une MERGE opération peut échouer si plusieurs lignes du jeu de données source correspondent et tentent de mettre à jour les mêmes lignes de la table Delta cible. d’après la SQL sémantique de fusion, une telle opération de mise à jour est ambiguë car il est difficile de déterminer 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. Voir l' exemple de capture de données modifiées: il prétraite le jeu de données de modification (autrement dit, le jeu de données source) pour conserver uniquement 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 de Upsert, l’application d’opérations de type 2, etc. Pour obtenir quelques exemples, consultez MERGE INTO .