# Merge

Der Zusatz Merge kann zu jedem LOAD- oder SELECT-Befehl im Skript hinzugefügt werden, um anzugeben, dass die geladene Tabelle mit einer anderen Tabelle zusammengeführt werden soll. Er gibt auch an, dass dieser Befehl in einem partiellen Ladevorgang ausgeführt werden soll.

In einem typischen Fall laden Sie ein Änderungsprotokoll und möchten es verwenden, um inserts, updates und deletes auf eine vorhandene Tabelle anzuwenden.

InformationshinweisDamit der partielle Ladevorgang korrekt funktioniert, muss die Anwendung mit Daten geöffnet werden, bevor der partielle Ladevorgang ausgelöst wird.

Führen Sie einen partiellen Ladevorgang durch, indem Sie die Schaltfläche Laden nutzen. Weitere Informationen finden Sie unter [Schaltfläche](https://help.qlik.com/de-DE/cloud-services/Subsystems/Hub/Content/Sense_Hub/Visualizations/Button/button.htm). Sie können auch das Qlik Engine JSON API verwenden.

Um einen partiellen Ladevorgang nach einem Zeitplan durchzuführen, klicken Sie in einer Anwendung auf the Mehr icon und wählen Sie dann Erneutes Laden planen aus. Im Dialogfeld, das geöffnet wird, aktivieren Sie Partielles Laden.

Syntax:

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

Argumente:

Argumente

| Argument | Beschreibung |
| --- | --- |
| only | Ein optionaler Qualifizierer, der bewirkt, dass der Befehl nur bei der partiellen Ausführung des Skripts berücksichtigt wird. Bei normalen (nicht partiellen) Ladevorgängen wird die Anweisung ignoriert. |
| SequenceNoField | Der Name des Felds, das einen Zeitstempel oder eine Sequenznummer enthält, die die Vorgangsreihenfolge bestimmt. |
| SequenceNoVar | Der Name der Variablen, der ein Höchstwert für SequenceNoField in der zusammenzuführenden Tabelle zugewiesen wird. |
| ListOfKeys | Eine kommagetrennte Liste von Feldnamen, die den Primärschlüssel angeben. |
| Operation | Das erste Feld der load-Anweisung muss die Operation als Textstring enthalten: „Insert“, „Update“ oder „Delete“. „i“, „u“ und „d“ werden ebenfalls akzeptiert. |

## Allgemeine Funktionen

Während eines normalen (nicht partiellen) Ladevorgangs funktioniert die Konstruktion Merge LOAD als normale load-Anweisung, aber mit der zusätzlichen Funktion, dass ältere obsolete Datensätze und für die Löschung vorgemerkte Datensätze entfernt werden. Das erste Feld der load-Anweisung muss Informationen zum Vorgang enthalten: Insert, Update oder Delete.

Für jeden geladenen Datensatz wird der Datensatzidentifikator mit den zuvor geladenen Datensätzen verglichen, und nur der neueste Datensatz (entsprechend der Sequenznummer) wird beibehalten. Wenn der neueste Datensatz mit Delete markiert ist, wird keiner beibehalten.

### Zieltabelle

Anhand des Feldersatzes wird entschieden, welche Tabelle geändert werden muss. Wenn eine Tabelle mit dem gleichen Feldersatz (außer dem ersten Feld, der Operation) bereits vorhanden ist, ist dies die zu ändernde Tabelle. Alternativ kann ein Präfix Concatenate verwendet werden, um die Tabelle anzugeben. Wenn die Zieltabelle nicht bestimmt ist, wird das Ergebnis der Konstruktion Merge LOAD in einer neuen Tabelle gespeichert.

Wenn das Präfix „Concatenate“ verwendet wird, enthält die Ergebnistabelle einen Satz Felder entsprechend der Verbindung der vorhandenen Tabelle und der Eingabe zur Zusammenführung. Daher kann die Zieltabelle mehr Felder erhalten als das Änderungsprotokoll, das als Eingabe für die Zusammenführung verwendet wird.

Ein partieller Ladevorgang hat die gleiche Wirkung wie ein vollständiger Ladevorgang. Ein Unterschied besteht darin, dass ein partieller Ladevorgang nur selten eine neue Tabelle erstellt. Außer bei Verwendung der Bedingung Only ist immer bereits eine Zieltabelle mit dem gleichen Feldersatz aus der vorherigen Skriptausführung vorhanden.

### Sequenznummer

Wenn es sich bei dem geladenen Änderungsprotokoll um ein kumuliertes Protokoll handelt, das bereits geladene Änderungen enthält, kann der Parameter SequenceNoVar in einem Where-Befehl verwendet werden, um die Menge der Eingabedaten zu begrenzen. Merge LOAD kann dann nur zum Laden von Datensätzen angewendet werden, in denen das Feld SequenceNoField größer als SequenceNoVar ist. Nach Abschluss weist Merge LOAD einen neuen Wert zu SequenceNoVar zu, wobei der Wert im Feld SequenceNoField der Höchstwert ist.

### Vorgänge

Merge LOAD kann weniger Felder als die Zieltabelle enthalten. Die verschiedenen Operationen behandeln fehlende Felder unterschiedlich:

Insert: Felder, die in Merge LOAD fehlen, aber in der Zieltabelle vorhanden sind, erhalten eine NULL in der Zieltabelle.

Delete: Fehlende Felder wirken sich nicht auf das Ergebnis aus. Die betreffenden Datensätze werden dennoch gelöscht.

Update: In Merge LOAD aufgelistete Felder werden in der Zieltabelle aktualisiert. Fehlende Felder werden nicht geändert. Das bedeutet, dass die beiden folgenden Anweisungen nicht identisch sind:

* 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 ...;

Mit der ersten Anweisung werden die aufgelisteten Datensätze aktualisiert und F2 zu NULL geändert. Mit dem zweiten wird F2 nicht geändert, sondern die Werte werden in der Zieltabelle abgelegt.

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

#### Beispiele

## Beispiel 1: Einfaches Zusammenführen mit der angegebenen Tabelle

In diesem Beispiel wird eine Inline-Tabelle mit dem Namen Persons mit drei Zeilen geladen. Merge ändert dann die Tabelle wie folgt:

* Fügt die Zeile Mary, 4 hinzu.
* Löscht die Zeile Steven, 3.
* Weist die Nummer 5 zu Jake zu.

Die Variable LastChangeDate wird auf den Höchstwert in der Spalte ChangeDate festgelegt, nachdem Merge ausgeführt wurde.

### Ladeskript

Fügen Sie Ihrer Anwendung das Beispielskript hinzu und führen Sie dieses aus. Fügen Sie einem Arbeitsblatt in Ihrer Anwendung dann die Felder hinzu, die in der Ergebnisspalte aufgeführt sind, um das Ergebnis anzuzeigen.

```
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
];
```

Weitere Informationen über Inline-Ladevorgänge finden Sie unter [Verwenden von Inline-Ladevorgängen zum Laden von Daten](https://help.qlik.com/de-DE/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/inline-loads-qs.htm).

### Ergebnis

Vor dem Merge Load sieht die Ergebnistabelle wie folgt aus:

Resulting table

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

Nach dem Merge Load sieht die Ergebnistabelle wie folgt aus:

Resulting table

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

Wenn die Daten geladen werden, zeigt das Dialogfeld Datenladefortschritt die durchgeführten Vorgänge an:

Dialogfeld „Datenladefortschritt“

![Dialogfeld „Datenladefortschritt“.](https://help.qlik.com/de-DE/cloud-services/Subsystems/Hub/Content/Resources/Images/ui_gen_data_load_merge.png)

## Beispiel 2: Datenladeskript mit fehlenden Feldern

In diesem Beispiel werden die gleichen Daten wie oben geladen, aber jetzt mit einer ID pro Person.

Merge ändert die Tabelle wie folgt:

* Fügt die Zeile Mary, 4 hinzu.
* Löscht die Zeile Steven, 3.
* Weist die Nummer 5 zu Jake zu.
* Weist die Nummer 6 zu Jill zu.

### Ladeskript

Hier verwenden wir zwei Merge Load-Anweisungen, eine für das „Einfügen“ und „Löschen“ und eine für „Aktualisieren“.

Fügen Sie Ihrer Anwendung das Beispielskript hinzu und führen Sie dieses aus. Fügen Sie einem Arbeitsblatt in Ihrer Anwendung dann die Felder hinzu, die in der Ergebnisspalte aufgeführt sind, um das Ergebnis anzuzeigen.

```
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
];
```

### Ergebnis

Nach den Merge Load-Anweisungen sieht die Tabelle wie folgt aus:

Resulting table

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

Beachten Sie, dass die zweite Merge-Anweisung nicht das Feld Name enthält. Daher werden die Namen nicht geändert.

## Beispiel 3: Datenladeskript – partieller Ladevorgang mit einer Where-Bedingung mit ChangeDate

Im folgenden Beispiel gibt das Argument Only an, dass der Befehl Merge nur während eines partiellen Ladevorgangs ausgeführt wird. Aktualisierungen werden gestützt auf das zuvor erfasste „LastChangeDate“ gefiltert. Nachdem Merge abgeschlossen ist, wird die Variable „LastChangeDate“ dem Höchstwert der Spalte „ChangeDate“ zugewiesen, die während der Zusammenführung verarbeitet wurde.

### Ladeskript

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

## Weitere Informationen

* [Partieller Ladevorgang](https://help.qlik.com/de-DE/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/PartialReload.htm)
* [Load](https://help.qlik.com/de-DE/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Load.htm)
* [Concatenate](https://help.qlik.com/de-DE/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/concatenate.htm)
* [Map](https://help.qlik.com/de-DE/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Map.htm)
* [Only](https://help.qlik.com/de-DE/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/Only.htm)