# Merge

Le préfixe Merge peut être ajouté à n'importe quelle instruction LOAD ou SELECT du script pour spécifier que la table chargée doit être fusionnée dans une autre table. Cela spécifie également que cette instruction doit être exécutée lors d'un chargement partiel.

Un cas d'utilisation type se produit, par exemple, lorsque vous chargez un journal des modifications et que vous souhaitez l'utiliser pour appliquer inserts, updates et deletes à une table existante.

Note InformationsPour que le chargement partiel fonctionne correctement, vous devez ouvrir l'application avec des données avant le déclenchement du chargement partiel.

Effectuez un chargement partiel via le bouton Charger. Pour plus d'informations, voir [Bouton](https://help.qlik.com/fr-FR/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Visualizations/Button/button.htm). Vous pouvez également utiliser Qlik Engine JSON API.

Merge [only] [(SequenceNoField [, SequenceNoVar])] On ListOfKeys [Concatenate [(TableName)]] (loadstatement | selectstatement)

Arguments

| Argument | Description |
| --- | --- |
| only | Qualificateur facultatif indiquant que l'instruction doit être exécutée uniquement lors des chargements partiels. Lors des chargements normaux (non partiels), l'instruction est ignorée. |
| SequenceNoField | Nom du champ contenant un horodatage ou un numéro de séquence définissant l'ordre des opérations. |
| SequenceNoVar | Nom de la variable à laquelle est assignée la valeur maximale de SequenceNoField de la table en cours de fusion. |
| ListOfKeys | Liste séparée par des virgules de noms de champ spécifiant la clé primaire. |
| Operation | Le premier champ de l'instruction LOAD doit contenir l'opération sous forme de chaîne de texte : 'Insert', 'Update' ou 'Delete'. ‘i’, ‘u’ et ‘d’ sont également acceptés. |

## Fonctionnalité générale

Lors d'un chargement normal (non partiel), la construction Merge LOAD fonctionne comme une instruction Load normale, mais avec la fonctionnalité supplémentaire consistant à supprimer les enregistrements plus anciens obsolètes et les enregistrements indiqués comme devant être supprimés. Le premier champ de l'instruction Load doit contenir des informations sur l'opération : Insert, Update ou Delete.

Pour chaque enregistrement chargé, l'identificateur d'enregistrement est comparé aux enregistrements précédemment chargés et seul le dernier enregistrement (en fonction du numéro de séquence) est conservé. Si le dernier enregistrement est marqué à l'aide de Delete, aucun n'est conservé.

### Table cible

La table à modifier est déterminée par l'ensemble de champs. Si une table avec le même ensemble de champs (sauf le premier champ ; l'opération) existe déjà, il s'agira de la table à modifier. Sinon, un préfixe Concatenate peut être utilisé pour spécifier la table. Si la table cible n'est pas déterminée, le résultat de l'instruction Merge LOAD est stocké dans une nouvelle table.

Si le préfixe Concatenate est utilisé, la table obtenue comprend un ensemble de champs correspondant à l'union de la table existante et de l'entrée de la fusion. Ainsi, la table cible peut recevoir plus de champs que le journal des modifications utilisé comme entrée de la fusion.

Un chargement partiel a le même résultat qu'un chargement complet. La différence réside dans le fait qu'un chargement partiel crée rarement une nouvelle table. À moins d'avoir utilisé la clause Only, il existe toujours une table cible avec le même ensemble de champs que l'exécution de script précédente.

### Nombre de séquences

Si le journal des modifications chargé est un journal accumulé, à savoir, s'il contient des modifications déjà chargées, il est possible d'utiliser le paramètre SequenceNoVar dans une clause Where pour limiter le nombre de données d'entrée. La construction Merge LOAD peut alors s'appliquer uniquement aux enregistrements à charger dont le champ SequenceNoField est supérieur à SequenceNoVar. Une fois terminée, la construction Merge LOAD assigne une nouvelle valeur à SequenceNoVar avec la valeur maximale trouvée dans le champ SequenceNoField.

### Opérations

La construction Merge LOAD peut contenir moins de champs que la table cible. Les différentes opérations traitent les champs manquants différemment :

Insert (Insérer) : les champs manquants dans la construction Merge LOAD, mais existants dans la table cible, reçoivent une valeur NULL dans la table cible.

Delete (Supprimer) : les champs manquants n'affectent pas le résultat. Les enregistrements pertinents sont de toute façon supprimés.

Update (Mettre à jour) : les champs figurant dans la construction Merge LOAD sont mis à jour dans la table cible. Les champs manquants ne sont pas modifiés. Cela signifie que les deux instructions suivantes ne sont pas identiques :

* Merge on Key Concatenate Load 'U' as Operation, Key, F1, Null() as F2 From ...;
* Merge on Key Concatenate Load 'U' as Operation, Key, F1 From ...;

La première instruction met à jour les enregistrements répertoriés et remplace F2 par NULL. La deuxième instruction ne remplace pas F2, mais laisse les valeurs dans la table cible.

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Merge.htm)

#### Exemples

## Exemple 1 : Fusion simple avec une table spécifiée

Dans cet exemple, une table inligne nommée Persons est chargée avec trois lignes. Merge change ensuite la table comme suit :

* Ajoute la ligne Mary, 4.
* Supprime la ligne Steven, 3.
* Assigne le numéro 5 à Jake.

La variable LastChangeDate est définie sur la valeur maximale de la colonne ChangeDate après l'exécution de la commande Merge.

### Script de chargement

Ajoutez l'exemple de script à votre application et exécutez-le. Pour afficher le résultat, ajoutez les champs répertoriés dans la colonne de résultats à une feuille de votre application.

```
Set DateFormat='D/M/YYYY';
Persons:
load * inline [
Name, Number
Jake, 3
Jill, 2
Steven, 3
];

Merge (ChangeDate, LastChangeDate) on Name Concatenate(Persons)
LOAD * inline [
Operation, ChangeDate,   Name,     Number
Insert,    1/1/2021,     Mary,     4
Delete,    1/1/2021,     Steven, 
Update,    2/1/2021,     Jake,     5
];
```

Pour plus d'informations sur l'utilisation des chargements inline, voir [Utilisation de chargements inline pour charger des données](https://help.qlik.com/fr-FR/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/inline-loads-qs.htm).

### Résultat

Avant l'application de la construction Merge Load, la table obtenue apparaît comme suit :

Resulting table

| Name | Number |
| --- | --- |
| Jake | 3 |
| Jill | 2 |
| Steven | 3 |

Après l'application de la construction Merge Load, la table apparaît comme suit :

Resulting table

| ChangeDate | Name | Number |
| --- | --- | --- |
| 2/1/2021 | Jake | 5 |
| - | Jill | 2 |
| 1/1/2021 | Mary | 4 |

Lors du chargement des données, la boîte de dialogue Progression du chargement de données indique les opérations effectuées :

Boîte de dialogue Progression du chargement de données

![Boîte de dialogue Progression du chargement de données.](https://help.qlik.com/fr-FR/sense/November2025/Subsystems/Hub/Content/Resources/Images/ui_gen_data_load_merge.png)

## Exemple 2 : Script de chargement de données avec champs manquants

Dans cet exemple, les mêmes données que susmentionnées sont chargées, mais, à présent, avec un ID pour chaque personne.

Merge change la table comme suit :

* Ajoute la ligne Mary, 4.
* Supprime la ligne Steven, 3.
* Assigne le numéro 5 à Jake.
* Assigne le numéro 6 à Jill.

### Script de chargement

Ici, nous utilisons deux instructions Merge Load, l'une pour ‘Insert’ et ‘Delete’ et la deuxième pour ‘Update’.

Ajoutez l'exemple de script à votre application et exécutez-le. Pour afficher le résultat, ajoutez les champs répertoriés dans la colonne de résultats à une feuille de votre application.

```
Set DateFormat='D/M/YYYY';
Persons:
Load * Inline [
PersonID, Name, Number
1, Jake, 3
2, Jill, 2
3, Steven, 3
];

Merge (ChangeDate, LastChangeDate) on PersonID Concatenate(Persons)
Load * Inline [
Operation, ChangeDate,   PersonID, Name,     Number
Insert,    1/1/2021,     4,        Mary,     4
Delete,    1/1/2021,     3,        Steven, 
];

Merge (ChangeDate, LastChangeDate) on PersonID Concatenate(Persons)
Load * Inline [
Operation, ChangeDate,   PersonID, Number
Update,    2/1/2021,     1,        5
Update,    3/1/2021,     2,        6
];
```

### Résultat

Après l'application des instructions Merge Load, la table apparaît comme suit :

Resulting table

| PersonID | ChangeDate | Name | Number |
| --- | --- | --- | --- |
| 1 | 2/1/2021 | Jake | 5 |
| 2 | 3/1/2021 | Jill | 6 |
| 4 | 1/1/2021 | Mary | 4 |

Notez que la deuxième instruction Merge n'inclut pas le champs Name et qu'en conséquence les noms n'ont pas été modifiés.

## Exemple 3 : Script de chargement de données - chargement partiel via une clause Where avec ChangeDate

Dans l'exemple suivant, l'argument Only spécifie que la commande Merge est uniquement exécutée lors d'un chargement partiel. Les mises à jour sont filtrées en fonction de la valeur de la variable LastChangeDate précédemment capturée. Après l'application de la commande Merge, la variable LastChangeDate se voit assigner la valeur maximale de la colonne ChangeDate traitée lors de la fusion.

### Script de chargement

```
Merge Only (ChangeDate, LastChangeDate) on Name Concatenate(Persons)
LOAD Operation, ChangeDate,  Name, Number 
from [lib://ChangeFilesFolder/BulkChangesInPersonsTable.csv] (txt)
where ChangeDate >='$(LastChangeDate)';
```

## En savoir plus

* [Chargement partiel](https://help.qlik.com/fr-FR/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/PartialReload.htm)
* [Load](https://help.qlik.com/fr-FR/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Load.htm)
* [Concatenate](https://help.qlik.com/fr-FR/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/concatenate.htm)
* [Map](https://help.qlik.com/fr-FR/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Map.htm)
* [Only](https://help.qlik.com/fr-FR/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/Only.htm)