Join
join 前缀可连接加载的表格和现有已命名的表格或最近创建的数据表。
连接数据的效果是通过一组额外的字段或属性(即目标表中尚未存在的字段或属性)来扩展目标表。源数据集和目标表之间任何常见的字段名称都用于计算如何关联新传入的记录。这通常被称为“自然连接”。根据连接关联的唯一性和所采用的连接类型,Qlik 连接操作可能导致生成的目标表具有比开始时更多或更少的记录。
连接类型
有四种类型的连接:
-
左连接
-
内连接
-
外连接
-
右连接
不同类型连接操作的示例结果集

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

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

外连接(默认)
当您需要保留目标记录和所有传入记录时,请使用 Outer Join。在未找到匹配项的情况下,每组记录仍会保留,而连接另一侧的字段将保持未填充状态(空值)。
如果省略了类型关键字,则默认连接类型为外连接。
外连接

右连接
此连接类型保留即将加载的所有记录,同时将连接目标表中的记录减少为仅在传入记录中存在关联匹配的记录。这是一种小众的连接类型,有时用作将已预加载的记录表缩减为所需子集的一种方法。
右连接

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

语法和参数
[inner | outer | left | right ]Join [ (tablename ) ]( loadstatement | selectstatement )
| 参数 | 说明 |
|---|---|
| tablename | 可以将命名的表格与加载的表格进行比较。 |
| loadstatement或 selectstatement | LOAD 或 SELECT 语句适用于加载的表格。 |
相关主题
这些主题可能有助于您使用此函数:
| 主题 | 描述 |
|---|---|
| 使用 Join 和 Keep 合并表格 | 本主题进一步解释了“连接”和“保留”数据集的概念。 |
| Keep | Keep 加载前缀类似于 Join 前缀,但它不组合源数据集和目标数据集。相反,它根据采用的操作类型(内、外、左或右)修剪每个数据集。 |
加载脚本示例 - 左连接
左连接保留主(目标)表中的所有记录,并添加来自第二个(源)表的匹配数据。如果源中没有匹配项,主表的记录仍然会出现,但源表中的字段为空。
将示例脚本添加到您的应用程序并运行它。要查看结果,请将结果列中列出的字段添加到应用程序中的工作表。
加载脚本
Table1:
Load * inline [
Column1, Column2
A, B
1, aa
2, cc
3, ee ];
Table2:
Left Join Load * inline [
Column1, Column3
A, C
1, xx
4, yy ]; 有关使用内联加载的更多信息,请参阅 使用内联加载来加载数据。
结果
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
| 2 | cc | - |
| 3 | ee | - |
此示例演示了 Left Join 输出,其中仅连接第一个(左)表中存在的值。
概述
假设您有一个订单列表,但并非所有订单都有匹配的客户记录。
加载脚本
Orders:
Load * inline [
OrderID, CustomerID, Amount
1, 101, 200
2, 102, 150
3, 104, 400
];
Customers:
Left Join (Orders)
Load * inline [
CustomerID, Name
101, Alice
102, Bob
103, Carol
];结果
如果在数据模型查看器中展开预览窗口,您将看到组织成表的部分完整结果集:
|
OrderID |
CustomerID | Amount | Name |
|---|---|---|---|
|
1 |
101 | 200 | Alice |
|
2 |
102 | 150 | Bob |
|
3 |
104 | 400 | - |
OrderID 1 和 2 有匹配的客户。 OrderID 3 没有匹配的客户,因此 Name 为空。
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
-
表示更改记录的数据集,该数据集加载到名为 Changes 的表中。它包含一个 Status ID 关键字段。
-
表示更改状态的第二个数据集,通过使用左 Join 加载前缀将其与原始更改记录连接来加载和组合。
此左连接确保更改记录保持完整,同时在基于共同的 Status 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');结果
打开数据模型查看器并注意数据模型的形状。仅存在一个非规范化表。它是所有原始更改记录的组合,匹配的状态属性连接到每个更改记录上。
|
Changes |
|---|
|
Change ID |
|
Status ID |
|
Scheduled Start Date |
|
Scheduled End Date |
|
Business Impact |
|
Status |
|
Sub Status |
如果在数据模型查看器中展开预览窗口,您将看到组织成表的此完整结果集的一部分:
|
Change ID |
Status ID | Scheduled Start Date | Scheduled End Date | Business Impact | Status | Sub Status |
|---|---|---|---|---|---|---|
|
10030 |
4 | 19/01/2022 | 23/02/2022 | None | Closed | Cancelled |
|
10031 |
3 | 20/01/2022 | 25/03/2022 | Low | Closed | Completed |
|
10015 |
3 | 04/01/2022 | 15/02/2022 | Low | Closed | Completed |
|
10103 |
1 | 02/04/2022 | 29/05/2022 | Medium | Open | Not Started |
| 10116 | 1 | 15/04/2022 | 24/04/2022 | None | Open | Not Started |
|
10134 |
1 | 03/05/2022 | 08/07/2022 | Low | Open | Not Started |
| 10264 | 1 | 10/09/2022 | 17/10/2022 | Medium | Open | Not Started |
|
10040 |
1 | 29/01/2022 | 22/04/2022 | None | Open | Not Started |
| 10323 | 1 | 08/11/2022 | 26/11/2022 | High | Open | Not Started |
| 10187 | 2 | 25/06/2022 | 24/08/2022 | Low | Open | Started |
| 10185 | 2 | 23/06/2022 | 08/09/2022 | None | Open | Started |
| 10220 | 2 | 28/07/2022 | 06/09/2022 | None | Open | Started |
| 10326 | 2 | 11/11/2022 | 05/12/2022 | None | Open | Started |
|
10138 |
2 | 07/05/2022 | 03/08/2022 | None | Open | Started |
| 10334 | 2 | 19/11/2022 | 06/02/2023 | Low | Open | Started |
由于 Status 表中的第五行(Status ID:'5',Status:'Closed',Sub Status:'Obsolete')不对应于 Changes 表中的任何记录,因此该行中的信息不会出现在上述结果集中。
返回到数据加载编辑器。加载数据并打开工作表。创建新表并将该字段添加为维度: Status。
添加此度量:
=Count([Change ID])
现在您可以按 Status 检查 Changes 的数量。
| Status | =Count([Change ID]) |
|---|---|
| Open | 12 |
| Closed | 3 |
加载脚本示例 - 内连接
内连接仅保留两个表中都存在的记录(基于匹配的字段值)。
加载脚本
将示例脚本添加到您的应用程序并运行它。要查看结果,请将结果列中列出的字段添加到应用程序中的工作表。
Table1:
Load * inline [
Column1, Column2
A, B
1, aa
2, cc
3, ee ];
Table2:
Inner Join Load * inline [
Column1, Column3
A, C
1, xx
4, yy ];有关使用内联加载的更多信息,请参阅 使用内联加载来加载数据。
结果
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
此示例演示了 Inner Join 输出,其中仅连接第一个(左)表和第二个(右)表中都存在的值。
概述
您有订单和已发货订单的列表。您只想要已发货的订单。
加载脚本
Orders:
Load * inline [
OrderID, Amount
1, 200
2, 150
3, 400
];
Shipped:
Inner Join (Orders)
Load * inline [
OrderID, ShipDate
2, 2022-05-01
3, 2022-05-02
4, 2022-05-03
];结果
如果在数据模型查看器中展开预览窗口,您将看到组织成表的部分完整结果集:
| OrderID | Amount | ShipDate |
|---|---|---|
| 2 | 150 | 2022-05-01 |
| 3 | 400 | 2022-05-02 |
仅出现 OrderID 2 和 3,因为它们在两个表中都存在。
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
-
表示更改记录的数据集,该数据集加载到名为 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 生成的表将仅包含在两个数据集中具有匹配信息的记录。
| Source System | Change ID | Business Impact |
|---|---|---|
| JIRA | 10030 | None |
| JIRA | 10134 | Low |
| JIRA | 10220 | None |
| JIRA | 10323 | High |
| JIRA | 10334 | Low |
加载脚本示例 - 外连接
外连接保留两个表中的所有记录。在没有匹配项的地方,字段留空。
加载脚本
将示例脚本添加到您的应用程序并运行它。要查看结果,请将结果列中列出的字段添加到应用程序中的工作表。
Table1:
Load * inline [
Column1, Column2
A, B
1, aa
2, cc
3, ee ];
Table2:
Outer Join Load * inline [
Column1, Column3
A, C
1, xx
4, yy ]; 有关使用内联加载的更多信息,请参阅 使用内联加载来加载数据。
结果
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
| 2 | cc | - |
| 3 | ee | - |
| 4 | - | yy |
在此示例中,两个表 Table1 和 Table2 合并为一个标记为 Table1 的表。在类似这样的情况下,通常使用 outer 前缀将多个表连接成一个表,以便对单个表的值执行聚合。
概述
您想要所有客户和订单的完整列表,即使某些客户没有订单,某些订单没有客户记录。
加载脚本
Orders:
Load * inline [
OrderID, CustomerID
1, 101
2, 102
3, 104
];
Customers:
Outer Join (Orders)
Load * inline [
CustomerID, Name
101, Alice
102, Bob
103, Carol
];结果
如果在数据模型查看器中展开预览窗口,您将看到组织成表的此完整结果集的一部分:
| OrderID | CustomerID | Name |
|---|---|---|
| 1 | 101 | Alice |
| 2 | 102 | Bob |
| 3 | 104 | - |
| - | 103 | Carol |
OrderID 3 没有匹配的客户(Name 为空)。
CustomerID 103(Carol)没有匹配的订单(OrderID 为空)。
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
-
表示更改记录的数据集,该数据集加载到名为 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 个生成的记录。
| Source System | Change ID | Business Impact |
|---|---|---|
| JIRA | 10030 | None |
| JIRA | 10134 | Low |
| JIRA | 10220 | None |
| JIRA | 10323 | - |
| JIRA | 10334 | Low |
| JIRA | 10597 | - |
| - | 10015 | Low |
| - | 10031 | Low |
| - | 10040 | None |
| - | 10138 | None |
加载脚本示例 - 右连接
右连接保留源表中的所有记录,并添加来自目标表的匹配信息。如果目标表没有匹配项,则其字段为空。
加载脚本
将示例脚本添加到您的应用程序并运行它。要查看结果,请将结果列中列出的字段添加到应用程序中的工作表。
Table1:
Load * inline [
Column1, Column2
A, B
1, aa
2, cc
3, ee ];
Table2:
Right Join Load * inline [
Column1, Column3
A, C
1, xx
4, yy ];有关使用内联加载的更多信息,请参阅 使用内联加载来加载数据。
结果
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
| 4 | - | yy |
此示例演示了 Right Join 输出,其中仅连接第二个(右)表中存在的值。
概述
您的源表是客户列表;您想要所有客户,加上任何匹配的订单。
加载脚本
Orders:
Load * inline [
OrderID, CustomerID
1, 101
2, 102
3, 104
];
Customers:
Right Join (Orders)
Load * inline [
CustomerID, Name
101, Alice
102, Bob
103, Carol
];结果
如果在数据模型查看器中展开预览窗口,您将看到组织成表的此完整结果集的一部分:
| CustomerID | Name | OrderID |
|---|---|---|
| 101 | Alice | 1 |
| 102 | Bob | 2 |
| 103 | Carol | - |
所有客户都会出现。Carol 没有订单(OrderID 为空)。
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
-
表示更改记录的数据集,该数据集加载到名为 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
现在您可以检查生成的五个记录。
| Source System | Change ID | Business Impact |
|---|---|---|
| Teamwork | 10015 | Low |
| Teamwork | 10031 | Low |
| Teamwork | 10040 | None |
| Teamwork | 10103 | Medium |
| Teamwork | 50231 | - |
故障排除 - 交叉连接
概述
如果您连接两个没有匹配字段名称的表,第一个表中的每一行都将与第二个表中的每一行组合——这可能会产生大量记录(笛卡尔积)并导致意外的数据关联。
加载脚本
TableA:
Load * inline [
A_ID, ValueA
1, foo
2, bar
];
TableB:
Join (TableA)
Load * inline [
B_ID, ValueB
10, baz
11, qux
];结果
如果在数据模型查看器中展开预览窗口,您将看到组织成表的此完整结果集的一部分:
| A_ID | ValueA | B_ID | ValueB |
|---|---|---|---|
| 1 | foo | 10 | baz |
| 1 | foo | 11 | qux |
| 2 | bar | 10 | baz |
| 2 | bar | 11 | qux |
每个 A_ID 都与每个 B_ID 配对(共 4 行)。