# 合并

可将前缀 Merge 添加至脚本中的任何 LOAD 或 SELECT 语句，以指定加载的表格应当合并到另一表中。它还指定此语句应在部分重新加载中运行。

典型的用例是当您加载更改日志并希望用此来将 inserts、updates 和 deletes 应用到现有的表时。

信息注释要使部分重新加载正常工作，必须在触发部分重新加载之前使用数据打开应用程序。

使用重新加载按钮执行部分重新加载。有关更多信息，请参阅[按钮](https://help.qlik.com/zh-CN/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，则不保留任何记录。

### 目标表格

要修改的表由字段集决定。如果已经存在具有相同字段集（第一个字段除外；操作）的表，则该表将是要修改的相关表。或者，可以使用 Concatenate 前缀来指定表。如果未确定目标表，则 Merge Load 构造的结果将存储在新表中。

如果使用了连接前缀，则生成的表具有一组字段，这些字段对应于现有表和待合并输入的并集。因此，目标表可能会获得比用作合并输入的更改日志更多的字段。

局部重新加载有和完全重新加载相同的作用。一项区别是，部分重新加载很少创建新表。除非使用了 Only 子句，否则始终存在字段集与上一次脚本执行中字段集相同的目标表。

### 序号

如果加载的更改日志是累积日志，即它包含已加载的更改，则可以在 Where 子句中使用该参数 SequenceNoVar 来限制输入数据量。Merge LOAD 然后可仅用于加载记录，其中字段 SequenceNoField 大于 SequenceNoVar。在完成之后，Merge Load 把新的值分配至 SequenceNoVar，其中最大值在 SequenceNoField 字段中可见。

### 操作

Merge Load 字段可以少于目标表。不同的操作对缺失字段的处理方式不同：

Insert：Merge LOAD 中缺少但存在于目标表中的字段在目标表中获取空值。

Delete：缺少字段不会影响结果。相关记录仍将被删除。

Update：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。

LastChangeDate 变量在执行 Merge 之后设置为 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-CN/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-CN/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 语句，一个用于‘Insert’ 和 ‘Delete’，另一个用于 ‘Update’。

将示例脚本添加到您的应用程序并运行它。要查看结果，请将结果列中列出的字段添加到应用程序中的工作表。

```
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：数据加载脚本 - 使用带有 ChangeDate 的 Where 子句部分重新加载

在下面的示例中，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-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/PartialReload.htm)
* [Load](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Load.htm)
* [Concatenate](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/concatenate.htm)
* [Map](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Map.htm)
* [Only](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/Only.htm)