MERGE INTO
S’applique à : Databricks SQL 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 [ 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 } } [, ...] }
Paramètres
WITH SCHEMA EVOLUTION
S’applique à : Databricks Runtime 15.2 et versions ultérieures
Active l’évolution automatique des schémas pour cette opération de
MERGE
. Lorsqu’elle est activée, le schéma de la table Delta cible est automatiquement mis à jour pour correspondre au schéma de la table source.-
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.
-
Alias de table pour la table cible. L’alias ne doit pas inclure une liste de colonnes.
-
Nom de table identifiant la table source à fusionner dans la table cible.
-
Alias de table pour la table source. L’alias ne doit pas inclure une liste de colonnes.
-
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 lamerge_condition
et lamatch_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.Remarque
Ce comportement change lorsque l’évolution 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 à : Databricks SQL Databricks Runtime 11.3 LTS et versions ultérieures
Vous pouvez définir
DEFAULT
en tant queexpr
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 clauseWHEN MATCHED
, sauf la dernière, doit avoir unmatched_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 à lamerge_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 desmerge_condition
et desnot_matched_condition
facultatifs.S’applique à : Databricks SQL Databricks Runtime 12.2 LTS 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.Remarque
Ce comportement change lorsque l’évolution 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 à : Databricks SQL Databricks Runtime 11.3 LTS 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 clausesWHEN NOT MATCHED
, à l’exception de la dernière, doivent avoir desnot_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 à : Databricks SQL Databricks Runtime 12.2 LTS 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 demerge_condition
et que lenot_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 à : Databricks SQL Databricks Runtime 11.3 LTS et versions ultérieures
Vous pouvez définir
DEFAULT
en tant queexpr
afin de mettre explicitement à jour la colonne sur sa valeur par défaut.
Important
L’ajout d’une clause
WHEN NOT MATCHED BY SOURCE
pour mettre à jour ou supprimer des lignes cibles lorsque la valeurmerge_condition
est 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 clauseWHEN NOT MATCHED BY SOURCE
, sauf la dernière, doit avoir unnot_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 SOURCE
n’est évaluée à true pour une ligne cible qui ne correspond à aucune ligne de la table source en fonction demerge_condition
, la ligne cible reste inchangée.
Important
MERGE
les opérations échouent avec une erreur DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE si plusieurs lignes de la table source correspondent à la même ligne dans la table cible en fonction des conditions spécifiées dans les clauses et WHEN MATCHED
des ON
clauses. Selon la sémantique SQL de fusion, ce type d’opération de mise à jour est ambigu, car il n’est pas clair 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. Cet exemple prétraite le jeu de données de modification (le jeu de données source) pour conserver uniquement la dernière modification de chaque clé avant d’appliquer cette modification à la table Delta cible. Dans Databricks Runtime 15.4 LTS et ci-dessous, MERGE
considère uniquement les conditions dans la ON
clause avant d’évaluer plusieurs correspondances.
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
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