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.
Effectuez un chargement partiel via le bouton Charger. Pour plus d'informations, voir Bouton. Vous pouvez également utiliser Qlik Engine JSON API.
Merge [only] [(SequenceNoField [, SequenceNoVar])] On ListOfKeys [Concatenate [(TableName)]] (loadstatement | selectstatement)
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 obsolètes plus anciens 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 la construction 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 : Les champs manquants dans la construction Merge LOAD, mais existants dans la table cible, reçoivent une valeur NULL dans la table cible.
Delete : Les champs manquants n'affectent pas le résultat. Les enregistrements pertinents sont de toute façon supprimés.
Update : Les champs figurant dans 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.