跳到主要内容

合并

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

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

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

使用重新加载按钮执行部分重新加载。有关更多信息,请参阅按钮您还可使用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 语句的第一个字段必须包含有关操作的信息:InsertUpdateDelete

对于每个加载的记录,将记录标识符与以前加载的记录进行比较,并且只保留最新的记录(根据序列号)。如果最新记录标有 Delete,则不保留任何记录。

目标表格

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

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

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

序号

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

运算

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

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

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

UpdateMerge 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,而是将值留在目标表中。