使用 Join 和 Keep 合并表 | Qlik Cloud帮助
跳到主要内容 跳到补充内容

使用 JoinKeep 合并表

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

联接已处于脚本中的表格是完全有可能的。Qlik Sense 逻辑随后无法看到单独的表格,但能看到联接结果,即单一的内部表格。某些情况下这是必要的,但也存在一些缺点:

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

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

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

SQL SELECT 语句中的连接

使用某些 ODBC 驱动程序,可以在 SELECT 语句中进行连接。这几乎等同于使用 Join 前缀进行连接。

但是,大多数 ODBC 驱动程序无法进行完全(双向)外部连接。它们只能进行左外部连接或右外部连接。左(右)外部连接仅包含连接键存在于左(右)表中的组合。完全外部连接包含任何组合。Qlik Sense 自动进行完全外部连接。

此外,在 SELECT 语句中进行连接比在 Qlik Sense 中进行连接要复杂得多。

SELECT DISTINCTROW

[Order Details].ProductID, [Order Details].

UnitPrice, Orders.OrderID, Orders.OrderDate, Orders.CustomerID

FROM Orders

RIGHT JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID;

SELECT 语句将包含虚构公司订单的表与包含订单详细信息的表连接起来。这是一个右外部连接,这意味着包含 OrderDetails 的所有记录,也包含具有在表 Orders 中不存在的 OrderID 的记录。但是,不包含存在于 Orders 中但不存在于 OrderDetails 中的订单。

Join

进行连接的最简单方法是在脚本中使用 Join 前缀,该前缀将内部表与另一个命名表或与最后创建的表连接起来。该连接将是外部连接,创建两个表中值的所有可能组合。

LOAD a, b, c from table1.csv;

join LOAD a, d from table2.csv;

生成的内部表具有字段 abcd。记录数因两个表的字段值而异。

信息注释要连接的字段名称必须完全相同。要连接的字段数是任意的。通常,这些表应该有一个或几个共同的字段。没有共同的字段将呈现表的笛卡尔积。所有字段都共同也是可能的,但通常没有意义。除非在 Join 语句中指定了先前加载的表的表名,否则 Join 前缀将使用最后创建的表。因此,这两个语句的顺序不是任意的。

有关详细信息,请参阅 Join

Keep

数据加载脚本中的显式 Join 前缀执行两个表的完全连接。结果是一个表。在许多情况下,此类连接将导致非常大的表。Qlik Sense 的主要功能之一是它能够在表之间建立关联而不是连接它们,这减少了内存空间,提高了速度并提供了极大的灵活性。keep 功能旨在减少需要使用显式连接的情况数量。

两个 LOADSELECT 语句之间的 Keep 前缀的作用是在将两个表存储在 Qlik Sense 中之前,将其中一个或两个表缩减为表数据的交集。Keep 前缀必须始终以关键字 InnerLeftRight 之一开头。从表中选择记录的方式与相应的连接中的方式相同。但是,这两个表未连接,并将作为两个单独命名的表存储在 Qlik Sense 中。

有关详细信息,请参阅 Keep

Inner

数据加载脚本中的 JoinKeep 前缀可以以 Inner 前缀开头。

如果在 Join 之前使用,它指定两个表之间的连接应为内部连接。生成的表仅包含两个表之间的组合,并具有来自双方的完整数据集。

如果在 Keep 之前使用,它指定在将两个表存储在 Qlik Sense 中之前,应将它们缩减为其共同的交集。

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

Table 1
A B
1 aa
2 cc
3 ee
Table2
A C
1 xx
4 yy

Inner Join

首先,我们对表执行 Inner Join,生成 VTable,它仅包含一行,即两个表中都存在的唯一记录,其中包含来自两个表的组合数据。

VTable:

SELECT * from Table1;

inner join SELECT * from Table2;

VTable
A B C
1 aa xx

Inner Keep

如果改为执行 Inner Keep,您仍然会有两个表。这两个表通过公共字段 A 关联。

VTab1:

SELECT * from Table1;

VTab2:

inner keep SELECT * from Table2;

VTab1
A B
1 aa
VTab2
A C
1 xx

有关详细信息,请参阅 Inner

Left

数据加载脚本中的 JoinKeep 前缀可以以 left 前缀开头。

如果在 Join 之前使用,它指定两个表之间的连接应为左连接。生成的表仅包含两个表之间的组合,并具有来自第一个表的完整数据集。

如果在 Keep 之前使用,它指定在将第二个表存储在 Qlik Sense 中之前,应将其缩减为与第一个表的共同交集。

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

Table1
A B
1 aa
2 cc
3 ee
Table2
A C
1 xx
4 yy

首先,我们对表执行 Left Join,生成 VTable,它包含 Table1 中的所有行,并与 Table2 中匹配行的字段组合。

VTable:

SELECT * from Table1;

left join SELECT * from Table2;

VTable
A B C
1 aa xx
2 cc -
3 ee -

如果改为执行 Left Keep,您仍然会有两个表。这两个表通过公共字段 A 关联。

VTab1:

SELECT * from Table1;

VTab2:

left keep SELECT * from Table2;

VTab1
A B
1 aa
2 cc
3 ee
VTab2
A C
1 xx

有关详细信息,请参阅 Left

Right

数据加载脚本中的 JoinKeep 前缀可以以 right 前缀开头。

如果在 Join 之前使用,它指定两个表之间的连接应为右连接。生成的表仅包含两个表之间的组合,并具有来自第二个表的完整数据集。

如果在 Keep 之前使用,它指定在将第一个表存储在 Qlik Sense 中之前,应将其缩减为与第二个表的共同交集。

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

Table1
A B
1 aa
2 cc
3 ee
Table2
A C
1 xx
4 yy

首先,我们对表执行 Right Join,生成 VTable,它包含 Table2 中的所有行,并与 Table1 中匹配行的字段组合。

VTable:

SELECT * from Table1;

right join SELECT * from Table2;

VTable
A B C
1 aa xx
4 - yy

如果改为执行 Right Keep,您仍然会有两个表。这两个表通过公共字段 A 关联。

VTab1:

SELECT * from Table1;

VTab2:

right keep SELECT * from Table2;

VTab1
A B
1 aa
VTab2
A C
1 xx
4 yy

有关详细信息,请参阅 Right

本页面有帮助吗?

如果您发现此页面或其内容有任何问题 – 打字错误、遗漏步骤或技术错误 – 请告诉我们!