# Scal

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.

InformacjaAby częściowe ładowanie działało poprawnie, aplikacja musi zostać otwarta z danymi przed jego uruchomieniem.

Wykonaj częściowe ładowanie za pomocą przycisku Ładuj. Więcej informacji zawiera temat [Przycisk](https://help.qlik.com/pl-PL/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Visualizations/Button/button.htm). Możesz także użyć Qlik Engine JSON API.

Składnia:

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

Argumenty:

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.

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

#### Przykłady

## Przykład 1: proste scalanie z określoną tabelą

W tym przykładzie tabela z danymi wpisanymi w skrypcie o nazwie Persons jest ładowana z trzema wierszami. Polecenie Merge następnie zmienia tabelę w następujący sposób:

* Dodaje wiersz Mary, 4.
* Usuwa wiersz Steven, 3.
* Przypisuje liczbę 5 do Jake.

Po wykonaniu instrukcji Merge zmienna LastChangeDate ma ustawioną maksymalną wartość w kolumnie ChangeDate.

### Skrypt ładowania

Dodaj skrypt przykładowy do swojej aplikacji i uruchom go. Aby zobaczyć wynik, dodaj do arkusza w swojej aplikacji pola wyszczególnione w kolumnie wyników.

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

Aby uzyskać więcej informacji o ładowaniu wbudowanym, zobacz temat [Używanie wbudowanych ładowań do ładowania danych](https://help.qlik.com/pl-PL/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Scripting/inline-loads-qs.htm).

### Wynik

Przed załadowaniem tabeli przy użyciu instrukcji Merge Load wynikowa tabela wygląda następująco:

Resulting table

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

Po załadowaniu tabeli przy użyciu instrukcji Merge Load tabela wygląda następująco:

Resulting table

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

Podczas ładowania danych okno dialogowe Postęp ładowania danych przedstawia wykonywane operacje:

Okno dialogowe Postęp ładowania danych

![Okno dialogowe Postęp ładowania danych.](https://help.qlik.com/pl-PL/sense/May2026/Subsystems/Hub/Content/Resources/Images/ui_gen_data_load_merge.png)

## Przykład 2: skrypt ładowania danych z brakującymi polami

W tym przykładzie ładowane są te same dane co powyżej, ale teraz z identyfikatorem dla każdej osoby.

Polecenie Merge następnie zmienia tabelę następująco:

* Dodaje wiersz Mary, 4.
* Usuwa wiersz Steven, 3.
* Przypisuje liczbę 5 do Jake.
* Przypisuje liczbę 6 do Jill.

### Skrypt ładowania

Tutaj używamy dwóch instrukcji Merge Load — jednej dla „Insert” i „Delete”, a drugiej dla „Update”.

Dodaj skrypt przykładowy do swojej aplikacji i uruchom go. Aby zobaczyć wynik, dodaj do arkusza w swojej aplikacji pola wyszczególnione w kolumnie wyników.

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

### Wynik

Po załadowaniu tabeli przy użyciu instrukcji Merge Load tabela wygląda następująco:

Resulting table

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

Zauważ, że druga instrukcja Merge nie zawiera pola Name, w związku z czym imiona nie zostały zmienione.

## Przykład 3: skrypt ładowania danych — częściowe ładowanie przy użyciu klauzuli Where z ChangeDate

W poniższym przykładzie argument Only określa, że polecenie Merge jest wykonywane tylko podczas częściowego ładowania. Aktualizacje są filtrowane na podstawie wcześniej przechwyconych wartości zmiennej LastChangeDate. Po zakończeniu wykonywania instrukcji Merge zmiennej LastChangeDate jest przypisywana maksymalna wartość ChangeDate kolumny przetwarzanej podczas scalania

### Skrypt ładowania

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

## Dowiedz się więcej

* [Częściowe ładowanie](https://help.qlik.com/pl-PL/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/PartialReload.htm)
* [Load](https://help.qlik.com/pl-PL/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Load.htm)
* [Concatenate](https://help.qlik.com/pl-PL/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/concatenate.htm)
* [Map](https://help.qlik.com/pl-PL/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Map.htm)
* [Only](https://help.qlik.com/pl-PL/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Scripting/Only.htm)