# 使用 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 的所有记录包括在内，带有 OrderID 的订单不在 Orders 表格中。但是，在 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/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Join.htm)。

## Keep

数据加载脚本中的显式 Join 前缀可完全联接这两个表格。结果会生成一个表格。在许多情况下，这种联接将产生很大的表格。Qlik Sense 的其中一个主要功能就是使表格之间形成关联，而不是联接这些表格，这种关联可以大大减少使用内存，提高处理速度并且灵活多变。保存功能旨在减少需要使用显式联接的情况。

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

有关更多信息，请参阅[Keep](https://help.qlik.com/zh-CN/sense/May2025/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/sense/May2025/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/sense/May2025/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/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Right.htm)。