Merge
Do dowolnej instrukcji LOAD lub SELECT w skrypcie można dodać prefiks Merge, aby określić, że ładowana tabela powinna zostać scalona w innej tabeli. Określa on również, że ta instrukcja powinna być uruchamiana podczas częściowego ładowania.
Typowym użyciem jest załadowanie dziennika zmian i wykorzystanie go do zastosowania inserts, updates oraz deletes do istniejącej tabeli.
Wykonaj częściowe ładowanie za pomocą przycisku Ładuj. Więcej informacji zawiera temat Przycisk. Możesz także użyć Qlik Engine JSON API.
Składnia:
Merge [only] [(SequenceNoField [, SequenceNoVar])] On ListOfKeys [Concatenate [(TableName)]] (loadstatement | selectstatement)
Argumenty:
Argument | Opis |
---|---|
only | Opcjonalny kwalifikator wskazujący, że instrukcja ma być wykonywana tylko podczas częściowego ładowania. Tę instrukcję należy pominąć podczas normalnych (nie częściowych) ładowań. |
SequenceNoField | Nazwa pola zawierającego znacznik czasu lub numer kolejny, który definiuje kolejność operacji. |
SequenceNoVar |
Nazwa zmiennej, której przypisywana jest maksymalna wartość SequenceNoField scalanej tabeli. |
ListOfKeys | Lista nazw pól oddzielonych przecinkami, określająca klucz podstawowy. |
Operation | Pierwsze pole instrukcji load musi zawierać operację jako ciąg tekstowy: „Insert”, „Update” lub „Delete”. Akceptowane są także „i”, „u” i „d”. |
Ogólna funkcjonalność
Podczas normalnego (nie częściowego) ładowania konstrukcja Merge LOAD działa jako normalna instrukcja Load, ale z dodatkową funkcjonalnością polegającą na usuwaniu starszych, zbędnych rekordów oraz rekordów oznaczonych do usunięcia. Pierwsze pole instrukcji Load musi zawierać informacje o operacji: Insert, Update lub Delete.
W przypadku każdego załadowanego rekordu identyfikator rekordu jest porównywany z wcześniej załadowanymi rekordami i zachowany zostanie tylko najnowszy rekord (zgodnie z numeracją). Jeśli najnowszy rekord jest oznaczony Delete, żadne rekordy nie zostaną zachowane.
Tabela docelowa
Wybór tabeli do zmodyfikowania zależy od zestawu pól. Jeśli istnieje już tabela z tym samym zestawem pól (z wyjątkiem pierwszego pola, operacji), będzie to odpowiednia tabela do zmodyfikowania. Alternatywnie do określenia tabeli można użyć prefiksu Concatenate. Jeśli tabela docelowa nie jest określona, wynik konstrukcji Merge LOAD jest zapisywany w nowej tabeli.
Jeśli używany jest przedrostek Concatenate, wynikowa tabela zawiera zestaw pól stanowiący połączenie zbiorów istniejącej tabeli i danych wejściowych do scalenia. W związku z tym tabela docelowa może mieć więcej pól niż dziennik zmian, który jest używany jako dane wejściowe do scalania.
Częściowe ładowanie daje takie same rezultaty jak pełne. Różnica polega na tym, że częściowe ładowanie rzadko tworzy nową tabelę. O ile nie użyto klauzuli Only, tabela docelowa z tym samym zestawem pól z poprzedniego wykonania skryptu zawsze istnieje.
Numer sekwencji
Jeśli załadowany dziennik zmian jest dziennikiem akumulowanym, to znaczy zawiera zmiany, które zostały już załadowane, można użyć parametru SequenceNoVar w klauzuli Where w celu ograniczenia ilości danych wejściowych. Konstrukcji Merge LOAD można wówczas użyć do załadowania tylko rekordów, w których wartość pola SequenceNoField jest większa niż SequenceNoVar. Po zakończeniu konstrukcja Merge LOAD przypisuje nową wartość do SequenceNoVar z maksymalną wartością widoczną w polu SequenceNoField.
Operacje
Konstrukcja Merge LOAD może mieć mniej pól niż tabela docelowa. Różne operacje inaczej traktują brakujące pola:
Insert: pola brakujące w Merge LOAD, ale istniejące w tabeli docelowej, otrzymują wartość NULL w tabeli docelowej.
Delete: brakujące pola nie wpływają na wynik. Odpowiednie rekordy są i tak usuwane.
Update: pola wymienione w konstrukcji Merge LOAD są aktualizowane w tabeli docelowej. Brakujące pola nie są zmieniane. Oznacza to, że dwie poniższe instrukcje nie są identyczne:
- 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 ...;
Pierwsza instrukcja aktualizuje wymienione rekordy i zmienia F2 na NULL. Druga nie zmienia F2, ale zamiast tego pozostawia wartości w tabeli docelowej.