# 使用 Join 和 Keep 合并表格

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

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

* 加载表格往往会变得更大，这将使 Qlik Sense 运行得更慢。
* 一些信息可能会丢失：原始表格中的频率（记录数）可能不再可用。

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

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

## 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)。

## 使用 Join

Qlik Sense 脚本语言中的显式 Join 前缀可完全联接这两个表格。结果会生成一个表格。此类联接通常会导致非常大的表格。

执行以下操作：

1. 打开高级脚本教程应用程序。

2. 在数据加载编辑器中新增脚本段。

3. 调用部分 Transactions。

4. 在右菜单的 DataFiles 下，单击选择数据。

5. 上传然后选择 Transactions.csv。

   提示注释确保选中了字段名称下面的嵌入的字段名称以包含您加载数据时表格字段的名称。

6. 在选择数据来源窗口中，单击添加。

7. 上传然后选择 Salesman.xlsx。

8. 在选择数据来源窗口中，单击添加。

   您的脚本应如下所示：

   ```
   LOAD
       "Transaction ID",
       "Salesman ID",
       Product,
       "Serial No",
       "ID Customer",
       "List Price",
       "Gross Margin"
   FROM [lib://DataFiles/Transactions.csv]
   (txt, codepage is 28591, embedded labels, delimiter is ',', msq);

   LOAD
   "Salesman ID",
   Salesman,
   "Distributor ID"
   FROM [lib://DataFiles/Salesman.xlsx]
   (ooxml, embedded labels, table is Salesman);
   ```

9. 单击加载数据。

10. 打开数据模型查看器。数据模型如下所示：

    数据模型：Transactions、Salesman 和 Product 表格

    数据模型：Transactions、Salesman 和 Product 表格

    数据模型：TransactionsTransactions、SalesmanSalesman 和 ProductProduct 表格 ![数据模型、事务、销售人员和产品表。](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_gen_Join1.png)

然而，让 Transactions 和 Salesman 表格分离可能并非所需的结果。最好是将两个表格联接。

执行以下操作：

1. 要设置联接表的名称，请在第一条 LOAD 语句上方添加以下行：
   ```
   Transactions:
   ```
2. 要联接 Transactions 和 Salesman 表格，在第二个 LOAD 语句上方添加以下行：
   ```
   Join(Transactions)
   ```

   您的脚本应如下所示：
   ```
   Transactions:
   LOAD
       "Transaction ID",
       "Salesman ID",
       Product,
       "Serial No",
       "ID Customer",
       "List Price",
       "Gross Margin"
   FROM [lib://DataFiles/Transactions.csv]
   (txt, codepage is 28591, embedded labels, delimiter is ',', msq);

   Join(Transactions)
   LOAD
       "Salesman ID",
       Salesman,
       "Distributor ID"
   FROM [lib://DataFiles/Salesman.xlsx]
   (ooxml, embedded labels, table is Salesman);
   ```
3. 单击加载数据。
4. 打开数据模型查看器。数据模型如下所示：

   数据模型：Transactions 和 Product 表格

   数据模型：Transactions 和 Product 表格

   数据模型：TransactionsTransactions 和 ProductProduct 表格 ![联结后的数据模型。](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_gen_Join2.png)

   Transactions 和 Salesman 表格的所有字段现在都已合并成一个 Transactions 表格。

信息注释要详细了解何时使用Join，请参阅Qlik Community中的这些博客文章：[联接还是不联接](https://community.qlik.com/t5/Qlik-Design-Blog/To-Join-or-not-to-Join/ba-p/1463102)、[映射作为联接的替代方案](https://community.qlik.com/t5/Qlik-Design-Blog/Mapping-as-an-Alternative-to-Joining/bc-p/1473459)。 这些行为将在 QlikView 的上下文中讨论。然而，逻辑同样适用于 Qlik Sense。

## Keep

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。

注意这些仅为示例。在 Qlik Sense 中没有附带的练习。

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

Qlik Sense 脚本语言中的 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)。