# Join

join 前缀可连接加载的表格和现有已命名的表格或最近创建的数据表。

联接数据的效果是通过一组额外的字段或属性扩展目标表，即目标表中不存在的字段或特性。源数据集和目标表之间的任何公共字段名都用于确定如何关联新的传入记录。这通常被称为“自然联接”。根据联接关联的唯一性和使用的联接类型，Qlik 联接操作可能导致生成的目标表具有比开始时更多或更少的记录。

有四种类型的联接：

左侧联接

左联接是最常见的联接类型。例如，如果您有一个事务数据集，并希望将其与参考数据集组合，则通常会使用 `Left Join`。首先加载事务表，然后加载引用数据集，同时通过 `Left Join` 前缀将其连接到已加载的事务表。`Left Join` 将保持所有交易的原样，并添加找到匹配项的补充参考数据字段。

内部联接

当您有两个数据集，其中您只关心存在匹配关联的任何结果时，请考虑使用 `Inner Join`。如果未找到匹配项，这将从加载的源数据和目标表中删除所有记录。因此，这可能会使目标表中的记录比连接操作发生之前更少。

外部联接

当您需要同时保留目标记录和所有传入记录时，请使用 `Outer Join`。如果未找到匹配项，则仍保留每组记录，而连接另一侧的字段将保持未填充（空）。

如果省略类型关键字，则默认联接类型为外部联接。

右侧联接

此联接类型保留所有将要加载的记录，同时将联接所针对的表中的记录减少到只有传入记录中存在关联匹配的记录。这是一种利基联接类型，有时用于将已预加载的记录表缩减为所需子集。

来自不同类型联接操作的示例结果集

来自不同类型联接操作的示例结果集

来自不同类型联接操作的示例结果集 ![示例结果集来自不同类型的联接操作，每个操作之后都有数据表的前后表示。](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Resources/Images/scripting-functions-join-examples-operations.png)

信息注释如果联接操作的源和目标之间没有共同的字段名，则联接将导致所有行的笛卡尔乘积，这称为“交叉联接”。

“交叉联接”操作的示例结果集

“交叉联接”操作的示例结果集

“交叉联接”操作的示例结果集 ![在交叉联接操作（可以涉及任何类型的联接操作）之后，输入数据与输出进行比较之前和之后。](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Resources/Images/scripting-functions-examples-join-no-common-fields.png)

语法：

[inner | outer | left | right ]Join [ (tablename ) ]( loadstatement | selectstatement )

参数

| 参数 | 说明 |
| --- | --- |
| tablename | 可以将命名的表格与加载的表格进行比较。 |
| loadstatement或 selectstatement | LOAD 或 SELECT 语句适用于加载的表格。 |

这些主题可以帮助您使用此函数：

相关主题

| 主题 | 说明 |
| --- | --- |
| [使用 Join 和 Keep 合并表格](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/combine-tables-join-keep.htm) 中合并表格 | 本主题进一步解释了“连接”和“保留”数据集的概念。 |
| [Keep](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Keep.htm) | `Keep` 加载前缀类似于 `Join` 前缀，但它不组合源数据集和目标数据集。相反，它根据所采用的操作类型（内部、外部、左侧或右侧）修剪每个数据集。 |

## 示例 1 - 左联接：使用参考数据集丰富目标表

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Join.htm)

#### 加载脚本和结果

概述

打开数据加载编辑器，并将下面的加载脚本添加到新部分。

加载脚本包含：

* 表示更改记录的数据集，该数据集加载到名为 `Changes` 的表中。它包括一个状态 ID 关键字段。

* 表示变更状态的第二数据集，通过将其与左 `Join`加载前缀连接来加载并与原始变更记录组合。

此左联接确保更改记录保持完整，同时添加状态属性，其中根据公共状态 ID 找到传入状态记录中的匹配项。

加载脚本

```
Changes:
Load * inline [ 
Change ID	Status ID	Scheduled Start Date	Scheduled End Date	Business Impact 
10030	4	19/01/2022	23/02/2022	None
10015	3	04/01/2022	15/02/2022	Low
10103	1	02/04/2022	29/05/2022	Medium
10185	2	23/06/2022	08/09/2022	None
10323	1	08/11/2022	26/11/2022	High
10326	2	11/11/2022	05/12/2022	None
10138	2	07/05/2022	03/08/2022	None
10031	3	20/01/2022	25/03/2022	Low
10040	1	29/01/2022	22/04/2022	None
10134	1	03/05/2022	08/07/2022	Low
10334	2	19/11/2022	06/02/2023	Low
10220	2	28/07/2022	06/09/2022	None
10264	1	10/09/2022	17/10/2022	Medium
10116	1	15/04/2022	24/04/2022	None
10187	2	25/06/2022	24/08/2022	Low
] (delimiter is '\t');

Status:
Left Join (Changes)
Load * inline [
Status ID	Status	Sub Status
1	Open	Not Started
2	Open	Started
3	Closed	Completed
4	Closed	Cancelled
5	Closed	Obsolete			
] (delimiter is '\t');
```

结果

打开数据模型查看器，并记录数据模型的形状。仅存在一个非规范化表。它是所有原始变更记录的组合，匹配的状态属性连接到每个变更记录上。

得到内部数据模型

| 更改 |
| --- |
| 更改 ID |
| 状态 ID |
| 计划的开始日期 |
| 计划的结束日期 |
| 业务影响 |
| 状态 |
| 子状态 |

如果在数据模型查看器中展开预览窗口，您将看到整个结果集的一部分被组织到一个表中：

在数据模型查看器中预览更改表

| 更改 ID | 状态 ID | 计划的开始日期 | 计划的结束日期 | 业务影响 | 状态 | 子状态 |
| --- | --- | --- | --- | --- | --- | --- |
| 10030 | 4 | 19/01/2022 | 23/02/2022 | 无 | 关闭 | 已取消 |
| 10031 | 3 | 20/01/2022 | 25/03/2022 | 低 | 关闭 | 已完成 |
| 10015 | 3 | 04/01/2022 | 15/02/2022 | 低 | 关闭 | 已完成 |
| 10103 | 1 | 02/04/2022 | 29/05/2022 | 中等 | 打开 | 未开始 |
| 10116 | 1 | 15/04/2022 | 24/04/2022 | 无 | 打开 | 未开始 |
| 10134 | 1 | 03/05/2022 | 08/07/2022 | 低 | 打开 | 未开始 |
| 10264 | 1 | 10/09/2022 | 17/10/2022 | 中等 | 打开 | 未开始 |
| 10040 | 1 | 29/01/2022 | 22/04/2022 | 无 | 打开 | 未开始 |
| 10323 | 1 | 08/11/2022 | 26/11/2022 | 高 | 打开 | 未开始 |
| 10187 | 2 | 25/06/2022 | 24/08/2022 | 低 | 打开 | 已开始 |
| 10185 | 2 | 23/06/2022 | 08/09/2022 | 无 | 打开 | 已开始 |
| 10220 | 2 | 28/07/2022 | 06/09/2022 | 无 | 打开 | 已开始 |
| 10326 | 2 | 11/11/2022 | 05/12/2022 | 无 | 打开 | 已开始 |
| 10138 | 2 | 07/05/2022 | 03/08/2022 | 无 | 打开 | 已开始 |
| 10334 | 2 | 19/11/2022 | 06/02/2023 | 低 | 打开 | 已开始 |

由于 Status 表中的第五行（Status ID：'5'、Status：'Closed'、Sub Status：'Obsolete'）与 Changes 表中的任何记录都不对应，因此此行中的信息不会出现在上面的结果集中。

返回至数据加载编辑器。加载数据并打开工作表。创建新表并将该字段添加为维度： `Status`。

添加该度量：

`=Count([Change ID])`

现在您可以按状态检查更改的数量。

结果表

| 状态 | =Count([Change ID]) |
| --- | --- |
| 打开 | 12 |
| 关闭 | 3 |

## 示例 2 – 内部联接：仅合并匹配记录

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Join.htm)

#### 加载脚本和结果

概述

打开数据加载编辑器，并将下面的加载脚本添加到新部分。

加载脚本包含：

* 表示更改记录的数据集，该数据集加载到名为 `Changes` 的表中。

* 第二个数据集表示源系统 `JIRA` 中的变更记录。通过使用 `Inner Join` 加载前缀将其与原始记录连接，将其加载并合并。

该 `Inner Join` 确保只保留两个数据集中的五个变更记录。

加载脚本

```
Changes:
Load * inline [
Change ID	Status ID	Scheduled Start Date	Scheduled End Date	Business Impact
10030	4	19/01/2022	23/02/2022	None
10015	3	04/01/2022	15/02/2022	Low
10103	1	02/04/2022	29/05/2022	Medium
10185	2	23/06/2022	08/09/2022	None
10323	1	08/11/2022	26/11/2022	High
10326	2	11/11/2022	05/12/2022	None
10138	2	07/05/2022	03/08/2022	None
10031	3	20/01/2022	25/03/2022	Low
10040	1	29/01/2022	22/04/2022	None
10134	1	03/05/2022	08/07/2022	Low
10334	2	19/11/2022	06/02/2023	Low
10220	2	28/07/2022	06/09/2022	None
10264	1	10/09/2022	17/10/2022	Medium
10116	1	15/04/2022	24/04/2022	None
10187	2	25/06/2022	24/08/2022	Low
] (delimiter is '\t');

JIRA_changes:
Inner Join (Changes)
Load
  [Ticket ID] AS [Change ID],
  [Source System]
inline
[
Ticket ID	Source System
10000	JIRA					
10030	JIRA
10323	JIRA
10134	JIRA
10334	JIRA
10220	JIRA
20000	TFS
] (delimiter is '\t');
```

结果

加载数据并打开工作表。创建新表并将这些字段添加为维度：

* `Source System`

* `Change ID`

* `Business Impact`

现在您可以检查五个结果记录。来自 `Inner Join` 的结果表将只包括两个数据集中具有匹配信息的记录。

结果表

| 源系统 | 更改 ID | 业务影响 |
| --- | --- | --- |
| JIRA | 10030 | 无 |
| JIRA | 10134 | 低 |
| JIRA | 10220 | 无 |
| JIRA | 10323 | 高 |
| JIRA | 10334 | 低 |

## 示例 3 – 外部联接：合并重叠记录集

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Join.htm)

#### 加载脚本和结果

概述

打开数据加载编辑器，并将下面的加载脚本添加到新部分。

加载脚本包含：

* 表示更改记录的数据集，该数据集加载到名为 `Changes` 的表中。

* 第二个数据集表示源系统 `JIRA` 中的变更记录。通过使用 `Outer Join` 加载前缀将其与原始记录连接，将其加载并合并。

这确保了来自两个数据集的所有重叠更改记录都被保留。

加载脚本

```
// 8 Change records

Changes:
Load * inline [
Change ID	Status ID	Scheduled Start Date	Scheduled End Date	Business Impact
10030	4	19/01/2022	23/02/2022	None
10015	3	04/01/2022	15/02/2022	Low
10138	2	07/05/2022	03/08/2022	None
10031	3	20/01/2022	25/03/2022	Low
10040	1	29/01/2022	22/04/2022	None
10134	1	03/05/2022	08/07/2022	Low
10334	2	19/11/2022	06/02/2023	Low
10220	2	28/07/2022	06/09/2022	None
] (delimiter is '\t');

// 6 Change records

JIRA_changes:
Outer Join (Changes)
Load
  [Ticket ID] AS [Change ID],
  [Source System]
inline
[
Ticket ID	Source System
10030	JIRA
10323	JIRA
10134	JIRA
10334	JIRA
10220	JIRA
10597	JIRA
] (delimiter is '\t');
```

结果

加载数据并打开工作表。创建新表并将这些字段添加为维度：

* `Source System`

* `Change ID`

* `Business Impact`

现在您可以检查 10 个结果记录。

结果表

| 源系统 | 更改 ID | 业务影响 |
| --- | --- | --- |
| JIRA | 10030 | 无 |
| JIRA | 10134 | 低 |
| JIRA | 10220 | 无 |
| JIRA | 10323 | - |
| JIRA | 10334 | 低 |
| JIRA | 10597 | - |
| - | 10015 | 低 |
| - | 10031 | 低 |
| - | 10040 | 无 |
| - | 10138 | 无 |

## 示例 4 – 右联结：通过辅助主数据集修剪目标表

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Join.htm)

#### 加载脚本和结果

概述

打开数据加载编辑器，并将下面的加载脚本添加到新部分。

加载脚本包含：

* 表示更改记录的数据集，该数据集加载到名为 Changes 的表中。

* 第二数据集表示源系统 Teamwork 的变更记录。通过将其与 Right Join 加载前缀连接，将其加载并与原始记录组合。

这确保只保留 Teamwork 更改记录，而如果目标表没有匹配 Change ID，则不会丢失任何 Teamwork 记录。

加载脚本

```
Changes:

Load * inline [
Change ID	Status ID	Scheduled Start Date	Scheduled End Date	Business Impact
10030	4	19/01/2022	23/02/2022	None
10015	3	04/01/2022	15/02/2022	Low
10103	1	02/04/2022	29/05/2022	Medium
10185	2	23/06/2022	08/09/2022	None
10323	1	08/11/2022	26/11/2022	High
10326	2	11/11/2022	05/12/2022	None
10138	2	07/05/2022	03/08/2022	None
10031	3	20/01/2022	25/03/2022	Low
10040	1	29/01/2022	22/04/2022	None
10134	1	03/05/2022	08/07/2022	Low
10334	2	19/11/2022	06/02/2023	Low
10220	2	28/07/2022	06/09/2022	None
10264	1	10/09/2022	17/10/2022	Medium
10116	1	15/04/2022	24/04/2022	None
10187	2	25/06/2022	24/08/2022	Low
] (delimiter is '\t');

Teamwork_changes:
Right Join (Changes)
Load
  [Ticket ID] AS [Change ID],
  [Source System]
inline
[
Ticket ID	Source System
10040	Teamwork
10015	Teamwork
10103	Teamwork
10031	Teamwork
50231	Teamwork
] (delimiter is '\t');
```

结果

加载数据并打开工作表。创建新表并将这些字段添加为维度：

* Source System

* Change ID

* Business Impact

现在您可以检查五个结果记录。

结果表

| 源系统 | 更改 ID | 业务影响 |
| --- | --- | --- |
| 团队工作 | 10015 | 低 |
| 团队工作 | 10031 | 低 |
| 团队工作 | 10040 | 无 |
| 团队工作 | 10103 | 中等 |
| 团队工作 | 50231 | - |

## 了解详情

* [Load](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Load.htm)
* [Select](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Select.htm)
* [Inner](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Inner.htm)
* [Outer](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Outer.htm)
* [Left](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Left.htm)
* [Right](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Right.htm)
* [Keep](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Keep.htm)
* [使用 Join 和 Keep 合并表格](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/combine-tables-join-keep.htm)