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.
Führen Sie einen partiellen Ladevorgang durch, indem Sie die Schaltfläche Laden nutzen. Weitere Informationen finden Sie unter Button. Sie können auch das Qlik Engine JSON API verwenden.
Syntax:
Merge [only] [(SequenceNoField [, SequenceNoVar])] On ListOfKeys [Concatenate [(TableName)]] (loadstatement | selectstatement)
Argumente:
Argument | Beschreibung |
---|---|
only | Ein optionaler Qualifizierer, der bewirkt, dass die Anweisung 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.
Operationen
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.