合并在该页面上
可将前缀 Merge 添加至脚本中的任何 LOAD 或 SELECT 语句,以指定加载的表格应当合并到另一表中。它还指定此语句应在部分重新加载中运行。
典型的用例是当您加载更改日志并希望用此来将 inserts 、updates 和 deletes 应用到现有的表时。
信息注释 要使部分重新加载正常工作,必须在触发部分重新加载之前使用数据打开应用程序。
使用重新加载 按钮执行部分重新加载。有关更多信息,请参阅按钮 。 您还可使用Qlik Engine JSON API 。
语法:
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,而是将值留在目标表中。
示例
示例 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
];
有关使用内联加载的详细信息,请参见内联加载 。
结果
在 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
在加载数据之后,数据加载进度 对话框显示执行的操作:
数据加载进度对话框
示例 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);