# 合併

Merge 前置詞可新增至指令碼中的任何 LOAD 或 SELECT 陳述式，以指定載入的表格應合併至另一個表格中。這也能指定應在部分載入中執行此陳述式。

常見使用情況是當您載入變更記錄並想要用來將 inserts、updates 和 deletes 套用至現有表格時。

資訊備註為了讓部分載入正常運作，必須在觸發部分載入之前以資料開啟應用程式。

使用載入按鈕執行部分載入。如需詳細資訊，請參閱[按鈕](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Visualizations/Button/button.htm)。您也可以使用 Qlik Engine JSON API。

若要執行排程上的部分載入，請按一下應用程式上的 the 排程載入 icon，然後選擇 。在開啟的對話方塊中，開啟部分載入。

語法：

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

引數：

引數

| 引數 | 描述 |
| --- | --- |
| only | 選用的限定詞，表示只應在部分載入期間執行該陳述式。陳述式在一般 (非部分) 載入期間忽略。 |
| SequenceNoField | 包含時間戳記的欄位名稱或定義操作順序的序號。 |
| SequenceNoVar | 獲得指派合併表格的 SequenceNoField 最大值的變數名稱。 |
| ListOfKeys | 以逗號分隔、指定主要金鑰的欄位名稱清單。 |
| Operation | LOAD 陳述式的第一個欄位必須包含操作作為文字字串：'Insert'、'Update' 或 'Delete'。也接受 ‘i’、‘u’ 和 ‘d’。 |

## 一般功能

在一般 (非部分) 載入期間，Merge LOAD 建構會作為一般 Load 陳述式運作，但具有附加功能，可移除較舊過時記錄和標記要刪除的記錄。LOAD 陳述式的第一個欄位必須保留關於操作的資訊：Insert、Update 或 Delete。

對於每個載入的記錄，會比較記錄識別碼與先前載入的記錄，只會保留最新記錄 (根據序號)。若以 Delete 標記最新記錄，將不會保留任何內容。

### 目標表格

要修改哪個表格由欄位組決定。若具有相同欄位組 (第一個欄位除外；操作) 的表格已存在，這將會是要修改的相關表格。或者，串連前置詞可用來指定表格。若未決定目標表格，Merge LOAD 建構的結果會儲存在新的表格中。

若使用串連前置詞，產生的表格具有一組對應至現有表格聯集和要合併之輸入的欄位。因此，相較於作為要合併之輸入使用的變更記錄，目標表格可能會取得更多欄位。

部分載入會進行與完整載入相同的事項。差異是部分載入很少建立新的表格。除非您已使用 Only 子句，否則永遠存在具有相同欄位組 (來自先前指令碼執行) 的目標表格。

### 序號

若載入的變更記錄是累積記錄，亦即這包含已經載入的變更，則參數 SequenceNoVar 可用於 Where 子句，以限制輸入資料量。然後可以讓 Merge LOAD 僅載入記錄，其中欄位 SequenceNoField 大於 SequenceNoVar。完成後，Merge LOAD 會將新的值指派至 SequenceNoVar，並可在 SequenceNoField 欄位中看見最大值。

### 操作

Merge LOAD 可以有比目標表格更少的欄位。不同的操作以不同的方式處理遺失的欄位：

插入：在 Merge LOAD 中遺失但存在於目標表格的欄位，會在目標表格中取得 NULL。

刪除：遺失的欄位不會影響結果。仍會刪除相關記錄。

更新：列於 Merge LOAD 的欄位會在目標表格中更新。不會變更遺失的欄位。這表示下列兩個陳述式不相同：

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

第一個陳述式更新列出的記錄並將 F2 變更為 NULL。第二個不會變更 F2，但會在目標表格中留下值。

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

#### 範例

## 範例 1：與指定的表格簡單合併

在此範例中，載入了名為 Persons 的內嵌表格，其中含有三列。然後 Merge 會變更表格如下：

* 新增列 Mary, 4。
* 刪除列 Steven, 3。
* 將數字 5 指派至 Jake。

執行 Merge 後，LastChangeDate 變數會設定為 ChangeDate 欄中的最大值。

### 載入指令碼

將範例指令碼新增至您的應用程式並予以執行。若要查看結果，將結果資料行中列出的欄位新增至您應用程式中的工作表。

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

如需更多關於使用內嵌載入的資訊，請參閱 [使用內嵌載入以載入資料](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/inline-loads-qs.htm)。

### 結果

在 Merge Load 之前，產生的表格顯示如下：

Resulting table

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

在 Merge Load 之後，表格顯示如下：

Resulting table

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

載入資料時，資料載入進度 對話方塊會顯示執行的操作：

資料載入進度對話方塊

![資料載入進度對話方塊。](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Resources/Images/ui_gen_data_load_merge.png)

## 範例 2：含有遺失欄位的資料載入指令碼

在此範例中，會載入與上述相同的資料，但現在含有每個人的 ID。

Merge 會變更表格如下：

* 新增列 Mary, 4。
* 刪除列 Steven, 3。
* 將數字 5 指派至 Jake。
* 將數字 6 指派至 Jill。

### 載入指令碼

在此我們使用兩個 Merge Load 陳述式，一個用於「插入」和「刪除」，第二個用於「更新」。

將範例指令碼新增至您的應用程式並予以執行。若要查看結果，將結果資料行中列出的欄位新增至您應用程式中的工作表。

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

### 結果

在 Merge Load 陳述式之後，表格顯示如下：

Resulting table

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

請注意，第二個 Merge 陳述式不包括欄位 Name，因此尚未變更名稱。

## 範例 3：資料載入指令碼 - 使用 Where 子句與 ChangeDate 的部分載入

在以下範例中，Only 引數指定只能在部分載入期間執行 Merge 命令。會根據先前擷取的 LastChangeDate 篩選更新。完成 Merge 之後，會向 LastChangeDate 變數指派合併期間處理的 ChangeDate 欄的最大值。

### 載入指令碼

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

## 瞭解更多資訊

* [部分載入](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/PartialReload.htm)
* [Load](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Load.htm)
* [Concatenate](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/concatenate.htm)
* [Map](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Map.htm)
* [Only](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/Only.htm)