Fusionner dans (Delta Lake sur Azure Databricks)Merge Into (Delta Lake on Azure Databricks)

Fusionne un ensemble de mises à jour, d’insertions et de suppressions basées sur une table source dans une table Delta cible.Merge a set of updates, insertions, and deletions based on a source table into a target Delta table.

MERGE INTO [db_name.]target_table [AS target_alias]
USING [db_name.]source_table [<time_travel_version>] [AS source_alias]
ON <merge_condition>
[ WHEN MATCHED [ AND <condition> ] THEN <matched_action> ]
[ WHEN MATCHED [ AND <condition> ] THEN <matched_action> ]
[ WHEN NOT MATCHED [ AND <condition> ]  THEN <not_matched_action> ]

wherewhere

<matched_action>  =
  DELETE  |
  UPDATE SET *  |
  UPDATE SET column1 = value1 [, column2 = value2 ...]

<not_matched_action>  =
  INSERT *  |
  INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...])

<time_travel_version>  =
  TIMESTAMP AS OF timestamp_expression |
  VERSION AS OF version
  • Il peut y avoir un nombre quelconque de WHEN MATCHED WHEN NOT MATCHED clauses et.There can be any number of WHEN MATCHED and WHEN NOT MATCHED clauses.

Notes

Dans Databricks Runtime 7,2 et versions antérieures, MERGE peut avoir au maximum 2 WHEN MATCHED clauses et au plus 1 WHEN NOT MATCHED clause.In Databricks Runtime 7.2 and below, MERGE can have at most 2 WHEN MATCHED clauses and at most 1 WHEN NOT MATCHED clause.

  • 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.WHEN MATCHED clauses are executed when a source row matches a target table row based on the match condition. Ces clauses ont la sémantique suivante.These clauses have the following semantics.
    • WHEN MATCHED les clauses peuvent avoir au maximum UPDATE une DELETE action et.WHEN MATCHED clauses can have at most on UPDATE and one DELETE action. L' UPDATE action dans merge met à jour uniquement les colonnes spécifiées de la ligne cible correspondante.The UPDATE action in merge only updates the specified columns of the matched target row. L' DELETE action va supprimer la ligne correspondante.The DELETE action will delete the matched row.
    • Chaque WHEN MATCHED clause peut avoir une condition facultative.Each WHEN MATCHED clause can have an optional condition. 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.If this clause condition exists, the UPDATE or DELETE action is executed for any matching source-target row pair row only when when the clause condition is 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).If there are multiple WHEN MATCHED clauses, then they are evaluated in order they are specified (that is, the order of the clauses matter). Toutes les WHEN MATCHED clauses, à l’exception de la dernière, doivent avoir des conditions.All WHEN MATCHED clauses, except the last one, must have 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.If both WHEN MATCHED clauses have conditions and neither of the conditions are true for a matching source-target row pair, then the matched target row is left unchanged.
    • Pour mettre à jour toutes les colonnes de la table Delta cible avec les colonnes correspondantes du jeu de données source, utilisez UPDATE SET * .To update all the columns of the target Delta table with the corresponding columns of the source dataset, use UPDATE SET *. Cela équivaut à UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] pour toutes les colonnes de la table Delta cible.This is equivalent to UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] for all the columns of the target Delta table. 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.Therefore, this action assumes that the source table has the same columns as those in the target table, otherwise the query will throw an analysis error.
  • 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.WHEN NOT MATCHED clauses are executed when a source row does not match any target row based on the match condition. Ces clauses ont la sémantique suivante.These clauses have the following semantics.
    • WHEN NOT MATCHED les clauses peuvent uniquement avoir l' INSERT action.WHEN NOT MATCHED clauses can only have the INSERT action. La nouvelle ligne est générée en fonction de la colonne spécifiée et des expressions correspondantes.The new row is generated based on the specified column and corresponding expressions. Il n’est pas nécessaire de spécifier toutes les colonnes de la table cible.All the columns in the target table do not need to be specified. Pour les colonnes cibles non spécifiées, NULL est inséré.For unspecified target columns, NULL will be inserted.

      Notes

      Dans Databricks Runtime 6,5 et les versions antérieures, vous devez fournir toutes les colonnes de la table cible pour l' INSERT action.In Databricks Runtime 6.5 and below, you must provide all columns in the target table for the INSERT action.

    • Chaque WHEN NOT MATCHED clause peut avoir une condition facultative.Each WHEN NOT MATCHED clause can have an optional condition. Si la condition de clause est présente, une ligne source est insérée uniquement si cette condition est vraie pour cette ligne.If the clause condition is present, a source row is inserted only if that condition is true for that row. Dans le cas contraire, la colonne source est ignorée.Otherwise, the source column is ignored.

    • 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).If there are multiple WHEN NOT MATCHED clauses, then they are evaluated in order they are specified (that is, the order of the clauses matter). Toutes les WHEN NOT MATCHED clauses, à l’exception de la dernière, doivent avoir des conditions.All WHEN NOT MATCHED clauses, except the last one, must have conditions.

    • Pour insérer toutes les colonnes de la table Delta cible avec les colonnes correspondantes du jeu de données source, utilisez INSERT * .To insert all the columns of the target Delta table with the corresponding columns of the source dataset, use INSERT *. Cela équivaut à INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) pour toutes les colonnes de la table Delta cible.This is equivalent to INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) for all the columns of the target Delta table. 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.Therefore, this action assumes that the source table has the same columns as those in the target table, otherwise the query will throw an analysis error.

      Notes

      Ce comportement change lorsque la migration de schéma automatique est activée.This behavior changes when automatic schema migration is enabled. Pour plus d’informations, consultez évolution automatique du schéma .See Automatic schema evolution for details.

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.A MERGE operation can fail if multiple rows of the source dataset match and attempt to update the same rows of the target Delta table. En fonction de la sémantique SQL de Merge, 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.According to the SQL semantics of merge, such an update operation is ambiguous as it is unclear which source row should be used to update the matched target row. Vous pouvez prétraiter la table source pour éliminer le risque de correspondances multiples.You can preprocess the source table to eliminate the possibility of multiple matches. 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.See the Change data capture example—it preprocesses the change dataset (that is, the source dataset) to retain only the latest change for each key before applying that change into the target Delta table.

Notes

Dans Databricks Runtime 7,3 LTS et versions ultérieures, 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 s’il existe plusieurs correspondances).In Databricks Runtime 7.3 LTS and above, multiple matches are allowed when matches are unconditionally deleted (since unconditional delete is not ambiguous even if there are multiple matches).

ExemplesExamples

Vous pouvez utiliser MERGE 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 exemples de fusion .You can use MERGE for complex operations like deduplicating data, upserting change data, applying SCD Type 2 operations, etc. See Merge examples for a few examples.