使用 Join 和 Keep 合并表
将两个表格组合成一个表格的联接操作。组合后的表格记录是由原始表格的记录所组成,通常在将两个表格的记录合并到任何一个表格中时,一个常见值可用于一个或几个常见字段,这就是所谓的自然联接。在 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;
生成的内部表具有字段 a、b、c 和 d。记录数因两个表的字段值而异。
有关详细信息,请参阅 Join。
Keep
数据加载脚本中的显式 Join 前缀执行两个表的完全连接。结果是一个表。在许多情况下,此类连接将导致非常大的表。Qlik Sense 的主要功能之一是它能够在表之间建立关联而不是连接它们,这减少了内存空间,提高了速度并提供了极大的灵活性。keep 功能旨在减少需要使用显式连接的情况数量。
两个 LOAD 或 SELECT 语句之间的 Keep 前缀的作用是在将两个表存储在 Qlik Sense 中之前,将其中一个或两个表缩减为表数据的交集。Keep 前缀必须始终以关键字 Inner、Left 或 Right 之一开头。从表中选择记录的方式与相应的连接中的方式相同。但是,这两个表未连接,并将作为两个单独命名的表存储在 Qlik Sense 中。
有关详细信息,请参阅 Keep。
Inner
数据加载脚本中的 Join 和 Keep 前缀可以以 Inner 前缀开头。
如果在 Join 之前使用,它指定两个表之间的连接应为内部连接。生成的表仅包含两个表之间的组合,并具有来自双方的完整数据集。
如果在 Keep 之前使用,它指定在将两个表存储在 Qlik Sense 中之前,应将它们缩减为其共同的交集。
在这些示例中,我们使用源表 Table1 和 Table2:
| A | B |
|---|---|
| 1 | aa |
| 2 | cc |
| 3 | ee |
| A | C |
|---|---|
| 1 | xx |
| 4 | yy |
Inner Join
首先,我们对表执行 Inner Join,生成 VTable,它仅包含一行,即两个表中都存在的唯一记录,其中包含来自两个表的组合数据。
VTable:
SELECT * from Table1;
inner join SELECT * from Table2;
| A | B | C |
|---|---|---|
| 1 | aa | xx |
Inner Keep
如果改为执行 Inner Keep,您仍然会有两个表。这两个表通过公共字段 A 关联。
VTab1:
SELECT * from Table1;
VTab2:
inner keep SELECT * from Table2;
| A | B |
|---|---|
| 1 | aa |
| A | C |
|---|---|
| 1 | xx |
有关详细信息,请参阅 Inner。
Left
数据加载脚本中的 Join 和 Keep 前缀可以以 left 前缀开头。
如果在 Join 之前使用,它指定两个表之间的连接应为左连接。生成的表仅包含两个表之间的组合,并具有来自第一个表的完整数据集。
如果在 Keep 之前使用,它指定在将第二个表存储在 Qlik Sense 中之前,应将其缩减为与第一个表的共同交集。
在这些示例中,我们使用源表 Table1 和 Table2:
| A | B |
|---|---|
| 1 | aa |
| 2 | cc |
| 3 | ee |
| A | C |
|---|---|
| 1 | xx |
| 4 | yy |
首先,我们对表执行 Left Join,生成 VTable,它包含 Table1 中的所有行,并与 Table2 中匹配行的字段组合。
VTable:
SELECT * from Table1;
left join SELECT * from Table2;
| A | B | C |
|---|---|---|
| 1 | aa | xx |
| 2 | cc | - |
| 3 | ee | - |
如果改为执行 Left Keep,您仍然会有两个表。这两个表通过公共字段 A 关联。
VTab1:
SELECT * from Table1;
VTab2:
left keep SELECT * from Table2;
| A | B |
|---|---|
| 1 | aa |
| 2 | cc |
| 3 | ee |
| A | C |
|---|---|
| 1 | xx |
有关详细信息,请参阅 Left。
Right
数据加载脚本中的 Join 和 Keep 前缀可以以 right 前缀开头。
如果在 Join 之前使用,它指定两个表之间的连接应为右连接。生成的表仅包含两个表之间的组合,并具有来自第二个表的完整数据集。
如果在 Keep 之前使用,它指定在将第一个表存储在 Qlik Sense 中之前,应将其缩减为与第二个表的共同交集。
在这些示例中,我们使用源表 Table1 和 Table2:
| A | B |
|---|---|
| 1 | aa |
| 2 | cc |
| 3 | ee |
| A | C |
|---|---|
| 1 | xx |
| 4 | yy |
首先,我们对表执行 Right Join,生成 VTable,它包含 Table2 中的所有行,并与 Table1 中匹配行的字段组合。
VTable:
SELECT * from Table1;
right join SELECT * from Table2;
| A | B | C |
|---|---|---|
| 1 | aa | xx |
| 4 | - | yy |
如果改为执行 Right Keep,您仍然会有两个表。这两个表通过公共字段 A 关联。
VTab1:
SELECT * from Table1;
VTab2:
right keep SELECT * from Table2;
| A | B |
|---|---|
| 1 | aa |
| A | C |
|---|---|
| 1 | xx |
| 4 | yy |
有关详细信息,请参阅 Right。