跳到主要内容

使用 Join 和 Keep 合并表格

在该页面上

使用 JoinKeep 合并表格

联接是指将两个表格组合成一个表格的操作。组合后的表格记录是由原始表格的记录所组成,通常在将两个表格的记录合并到任何一个表格中时,一个常见值可用于一个或几个常见字段,这就是所谓的自然联接。在 QlikView 中,联接可在脚本中创建,以生成逻辑表格。

QlikView 逻辑随后无法看到单独的表格,但能看到联接结果,即单一的内部表格。某些情况下这是必要的,但也存在一些缺点:

  • 加载表格往往会变得更大,这将使 QlikView 运行得更慢。
  • 一些信息可能会丢失:原始表格中的频率(记录数)可能不再可用。

Keep 功能可以在表格存入 QlikView 之前将两个表格中的一个或两个缩减为表格数据的交集,旨在减少需要使用显式联接的情况。

备注: 在本文档中,术语“联接”通常指创建内部表格前所作的联接。但是,创建内部表格后所作的关联在本质上也是联接。

Join

进行联接的最简单方法是在脚本中使用 Join 前缀,以联接内部表格与另一个命名表格或最后创建的表格。该联接是 outer join,创建两个表格的所有可能的数值组合。

Example:  

LOAD a, b, c from table1.csv;

join LOAD a, d from table2.csv;

结果内部表格包含字段 abcd。根据这两个表格的字段值不同,记录的数量也会有所不同。

备注: 联接的字段名称必须完全相同。联接的字段数可以是任意的。表格通常包含一个或几个共同字段。没有共同字段会致使表格生成笛卡儿积。所有字段均相同也是可能的,但通常没有意义。除非先前加载表格的名称在 Join 语句内有具体说明,否则 Join 前缀会使用先前最后创建的表格。因而此时两个语句的排列顺序并不是任意的。

Keep

QlikView 的其中一个主要功能就是使表格之间形成关联,而不是联接这些表格,这种关联可以大大减少使用内存,提高处理速度并且灵活多变。保存功能旨在减少需要使用显式联接的情况。

两个 LOADSELECT 语句之间的 Keep 前缀会将两个表格中的一个或两个表格缩减为表格数据交集,然后才将其存储到 QlikViewKeep 前缀必须是 InnerLeftRight 关键字之一。选择表格记录的方法与相应联接方法相同。但是,这两个表格并未联接,而是分别命名后存储在 QlikView 中。

Inner

QlikView 脚本语言中的 JoinKeep 前缀可以位于 Inner 前缀之后。

如果用于 Join 之前,说明两个表格之间的联接应为内部联接。由此生成的表格所包含的两表格之间的组合必带有两表格的完整数据集。

如果用于 Keep 之前,说明首先应使两个表格缩减为它们自身的共同交集,然后才可在 QlikView 中存储这些表格。

Example:  

在这些示例中,我们使用源表格 Table1Table2

Inner example tables, with one record appearing in both tables
Inner 示例源表格

首先,我们使用两个表格中合并的数据在表格上执行 Inner Join,从而使 VTable 仅包含一行,即两个表格中仅有的记录。

VTable:

SELECT * from Table1;

inner join SELECT * from Table2;

Inner Join example table, with the one record that appeared in both tables
Inner Join 示例

如果我们执行 Inner Keep,则会获得两个表格。这两个表格通过通过字段 A 关联。

VTab1:

SELECT * from Table1;

VTab2:

inner keep SELECT * from Table2;

Inner Keep example tables, both tables reduced to the one record that appeared in both tables
Inner Keep 示例

左对齐

QlikView 脚本语言中的 JoinKeep 前缀可以位于 left 前缀之后。

如果用于 Join 之前,说明两个表格之间的联接应为左联接。由此生成的表格所包含的两表格之间的组合仅带有第一个表格的完整数据集。

如果用于 Keep 之前,说明首先应使第二个表格缩减为其与第一个表格间的共同交集,然后才可在 QlikView 中存储此表格。

Example:  

在这些示例中,我们使用源表格 Table1Table2

Left example tables, with one record that appears in both tables
Left 示例源表格

首先,我们在表格上执行 Left Join,从而产生 VTable,其中包含 Table1 中的所有行(与 Table2 中匹配航的字段合并)。

VTable:

SELECT * from Table1;

left join SELECT * from Table2;

Left Join example table, with all records from the first table and the one record that appeared in both tables added from the second table
Left Join 示例

如果我们执行 Left Keep,则会获得两个表格。这两个表格通过通过字段 A 关联。

VTab1:

SELECT * from Table1;

VTab2:

left keep SELECT * from Table2;

Left Keep example tables, with the first table unchanged and the second table containing only the one record that appeared in both tables
Left Keep 示例

右侧

QlikView 脚本语言中的 JoinKeep 前缀可以位于 right 前缀之后。

如果用于 Join 之前,说明两个表格之间的联接应为右联接。生成的表格仅包含这两个表格的组合,其中第二个表格带有完整数据集。

如果用于 Keep 之前,说明首先应使第一个表格缩减为其与第二个表格间的共同交集,然后才可在 QlikView 中存储此表格。

Example:  

在这些示例中,我们使用源表格 Table1Table2

Right example tables, with one record that appears in both tables
Right 示例源表格

首先,我们在表格上执行 Right Join,从而产生 VTable,其中包含 Table2 中的所有行(与 Table1 中匹配航的字段合并)。

VTable:

SELECT * from Table1;

right join SELECT * from Table2;

Right Join example table, with all records from the second table and the one record that appeared in both tables added from the first table
Right Join 示例

如果我们执行 Right Keep,则会获得两个表格。这两个表格通过通过字段 A 关联。

VTab1:

SELECT * from Table1;

VTab2:

right keep SELECT * from Table2;

Right Keep example tables, with the second table unchanged and the first table containing only the one record that appeared in both tables
Right Keep 示例