# 使用 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 语句中指定了先前加载的表的表名，否则 Join 前缀将使用最后创建的表。因此，这两个语句的顺序不是任意的。

有关详细信息，请参阅 [Join](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Join.htm)。

## Keep

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

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

有关详细信息，请参阅 [Keep](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Keep.htm)。

## Inner

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

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

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

在这些示例中，我们使用源表 Table1 和 Table2：

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](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Inner.htm)。

## Left

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

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

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

在这些示例中，我们使用源表 Table1 和 Table2：

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](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Left.htm)。

## Right

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

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

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

在这些示例中，我们使用源表 Table1 和 Table2：

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](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Right.htm)。