

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 联接数据


您可以使用 Amazon Quick Sight 中的联接界面来联接来自一个或多个数据源的对象。通过使用 Amazon Quick Sight 加入数据，您可以合并不同的数据，而无需复制来自不同来源的数据。

## 联接数据集的类型


在两个 Quick Sight *逻辑表*之间执行联接，其中每个逻辑表都包含有关如何获取数据的信息。在 Quick Sight 中编辑数据集时，页面上半部分的联接图将每个逻辑表显示为矩形块。

Quick Sight 中有两种不同类型的联接数据集：同源数据集和跨源数据集。数据集没有任何联接或满足以下所有条件时，该数据集视为同源数据集：
+ 如果任何逻辑表引用了 Quick Sight 数据源：
  + 此数据集中的所有逻辑表都必须引用相同的 Quick Sight 数据源。如果两个单独的 Quick Sight 数据源引用同一个底层数据库，则不适用。它必须是完全相同的 Quick Sight 数据源。有关使用单个数据来源的更多信息，请参阅 [使用现有的数据来源创建数据集](create-a-data-set-existing.md)。
+ 如果任何逻辑表引用的是作为父数据集的 Quick Sight 数据集：
  + 父数据集必须使用直接查询。
  + 父数据集必须引用相同的 Quick Sight 数据源。

如果不满足上述条件，则数据集被视为跨源联接数据集。

## 关于联接数据集的事实


同源和跨源数据集联接都有以下限制。

### 联接数据集中可以包含的表数上限是多少？


所有联接数据集最多可以包含 32 个表。

### 联接数据能有多大？


允许的最大联接大小由所使用的查询模式和查询引擎决定。下表提供了有关要联接的表的不同大小限制的信息。大小限制适用于所有辅助表的总和。主表没有联接大小限制。
+ **同源表**-当表源自单个查询数据源时，Quick Sight 对联接大小不施加任何限制。这不会覆盖源查询引擎可能存在的联接大小限制。
+ **跨源数据集** - 这种类型的联接包含来自不同数据来源但未存储在 SPICE 中的表。对于这些类型的联接，Quick Sight 会自动识别数据集中最大的表。所有其他辅助表的总大小必须小于 1 GB。
+ **存储在 SPICE 中的数据集** - 这种类型的联接包含全部提取到 SPICE 的表。此联接中所有辅助表的总大小不能超过 20 GB。

有关 SPICE 数据库大小计算的更多信息，请参阅 [估计 SPICE 数据集的大小](spice.md#spice-capacity-formula)。

### 联接数据集可以使用直接查询吗？


假设使用直接查询没有其他限制，则同源数据集支持直接查询。例如，S3 数据来源不支持直接查询，因此同源的 S3 数据集仍必须使用 SPICE。

跨源数据集必须使用 SPICE。

### 联接中可以使用计算字段吗？


所有联接数据集都可以使用计算字段，但不能在任何 on 子句中使用计算字段。

### 联接中可以使用地理数据吗？


同源数据集支持地理数据类型，但不能在任何 on 子句中使用地理字段。

跨源数据集不支持任何形式的地理数据。

有关跨数据源联接表的一些示例，请参阅 Amazon 大数据博客上的 “[在 Amazon Quick Sight 上跨数据源联接](https://www.amazonaws.cn/blogs/big-data/joining-across-data-sources-on-amazon-quicksight/)” 一文。

## 创建联接


要联接表以便在数据集中使用，请按照以下过程操作。在开始之前，请导入或连接到您的数据。您可以在 Amazon Quick Sight 支持的任何数据源之间创建联接，但物联网 (IoT) 数据除外。例如，您可以在 Amazon S3 存储桶中添加逗号分隔值 (.csv) 文件、表、视图、SQL 查询或 JSON 对象。

**添加一个或多个联接**

1. 打开您希望使用的数据集。

1. （可选）在开始之前，请根据数据样本决定是否要禁用自动生成的预览。要将其关闭，请选择右上角的**自动预览**。默认情况下，此选项处于打开状态。

1. 如果您尚未选择查询模式，请选择**查询模式**。

   选择 **SPICE** 将您的数据集存储在 [SPICE](spice.md) 中，或者选择**直接查询**以每次提取实时数据。如果您的数据集包含一个或多个手动上传的文件，则您的数据集将自动存储在 SPICE 中。

   如果您愿意 **SPICE**，则数据会被提取到 Quick Sight 中。使用数据集的视觉对象在 SPICE 中运行查询，而不是在数据库上运行查询。

   如果选择**直接查询**，则不会将数据摄取到 SPICE。使用数据集的视觉对象数据库上运行查询，而不是在 SPICE 中运行查询。

   如果选择**查询模式**，请确保在联接中设置唯一键（如果适用），以提高加载视觉对象时的性能。

1. 在数据准备页面上，选择**添加数据**。

1. 在打开的**添加数据**页面中，选择以下选项之一，然后完成以下步骤：
   + 从数据集中添加数据：

     1. 选择**数据集**。

     1. 从列表中选择一个数据集。

     1. 选定**选择**。
   + 从数据来源添加数据：

     1. 选择**数据来源**。

     1. 从列表中选择一个数据来源。

     1. 选定**选择**。

     1. 从列表中选择一个表。

     1. 选定**选择**。
   + 通过多次添加表来创建自联接。名称后面会出现一个计数器。例如 **Product**、**Product (2)** 和 **Product (3)**。**字段**或**筛选条件**部分中的字段名称包括相同的计数器，以便您查看字段来自表的哪个实例。
   + 选择**上传文件**，然后选择要联接的文件以添加新文件。

1. （可选）选择**使用自定义 SQL** 打开查询编辑器并为 SQL 数据来源编写查询。

1. （可选）添加数据后，通过选择每个表格的菜单图标与其进行交互。通过拖放表来重新排列。

   将出现一个带有红点的图标，以表示您需要配置此联接。对于尚未配置的联接，会出现两个红点。要创建联接，请选择第一个联接配置图标。

1. （可选）要更改现有联接，请通过选择两个表之间的联接图标来重新打开**联接配置**。

   随即将打开**联接配置**窗格。在联接界面上，指定联接类型以及用于联接表的字段。

1. 在屏幕的底部，您可以看到选项，用于将一个表中的字段设置为等于另一个表中的字段。

   1. 在 **Join clauses (联接子句)** 部分中，选择各个表的连接列。

     （可选）如果您选择的表在多个列上联接，请选择 **Add a new join clause (添加新的联接子句)**。执行此操作会将另一行添加到联接子句，这样您可以指定下一组要联接的列。重复该过程，直到您指定了两个数据对象的所有联接列。

1. 在**联接配置**窗格中，选择要应用的联接类型。如果联接字段是其中一个或两个表的唯一键，请启用唯一键设置。唯一键仅适用于直接查询，不适用于 SPICE 数据。

   有关联接的更多信息，请参阅 [联接类型](#join-types)。

1. 选择 **Apply (应用)** 以确认您的选择。

   要取消而不进行任何更改，请选择**取消**。

1. 工作区中的联接图标会发生变化以显示新的关系。

1. （可选）在**字段**部分中，您可以使用每个字段的菜单执行以下一项或多项操作：
   + 向地理空间字段**添加层次结构**。
   + **包含**或**排除**字段。
   + 针对字段**编辑名称和描述**。
   + **更改数据类型**。
   + **添加计算**（计算字段）。
   + **将访问权限限制为仅我可访问**，因此只有您能看见。将字段添加到已在使用的数据集时，这会非常有用。

1. （可选）在**筛选条件**部分中，您可以添加或编辑筛选条件。有关更多信息，请参阅 [使用 Amazon Quick Sight 筛选数据](adding-a-filter.md)。

## 联接类型


Amazon Quick Sight 支持以下联接类型：
+ 内部联接
+ 左外部联接和右外部联接
+ 完全外部联接

我们来深入了解一下这些联接类型对数据所执行的操作。对于示例数据，我们使用以下名为 `widget` 和 `safety rating` 表。

```
SELECT * FROM safety-rating

rating_id	safety_rating
1		    A+
2		    A
3		    A-
4		    B+
5		    B

SELECT * FROM WIDGET

widget_id	   widget	safety_rating_id
1		    WidgetA		3
2		    WidgetB		1
3		    WidgetC		1
4		    WidgetD		2
5		    WidgetE
6		    WidgetF		5
7		    WidgetG
```

### 内部联接


如果您只想查看两个表之间存在匹配项的数据，请使用内部联接。例如，假设您对 **safety-rating** 和 **widget** 表执行内部联接。

在下面的结果集中，将删除没有安全评级的小部件，并删除没有关联小部件的安全评级。只包含完全匹配的行。

```
SELECT * FROM safety-rating
INNER JOIN widget
ON safety_rating.rating_id = widget.safety_rating_id

rating_id    safety_rating    widget_id    widget        safety_rating_id
3	        A-                1        WidgetA        3
1	        A+                2        WidgetB        1
1	        A+                3        WidgetC        1
2	        A                 4        WidgetD        2
5	        B                 6        WidgetF        5
```

### 左外部联接和右外部联接


这也称为左外部联接或右外部联接。如果要查看一个表中的所有数据，而只想查看另一个表中的匹配行，请使用向左或向右外连接。

在图形界面中，您可以查看哪个表位于左侧或右侧。在 SQL 语句中，第一个表被视为位于左侧。因此，选择左外部联接相对于右外部联接，仅取决于表在查询工具中的排列。

例如，假设您对（左表）和 `safety-rating``widgets`（右表）执行左外连接。在这种情况下，将返回所有 `safety-rating` 行并仅返回匹配的 `widget` 行。在结果集中，您可以看到没有匹配数据的空白。

```
SELECT * FROM safety-rating
LEFT OUTER JOIN widget
ON safety_rating.rating_id = widget.safety_rating_id

rating_id    safety_rating    widget_id   widget          safety_rating_id
1	        A+                2        WidgetB   	1
1	        A+                3        WidgetC   	1
2	        A                 4        WidgetD   	2
3	        A-                1        WidgetA   	3
4	        B+
5	        B                 6        WidgetF   	5
```

如果您改为使用右外连接，请按相同的顺序调用表，`safety-rating`因此在左边`widgets`，在右边。在这种情况下，只返回匹配的 `safety-rating` 行并返回所有 `widget` 行。在结果集中，您可以看到没有匹配数据的空白。

```
SELECT * FROM safety-rating
RIGHT OUTER JOIN widget
ON safety_rating.rating_id = widget.safety_rating_id

rating_id    safety_rating    widget_id   widget          safety_rating_id
3	        A-                1	WidgetA   	 3
1	        A+                2	WidgetB   	 1
1	        A+                3	WidgetC   	 1
2	        A                 4	WidgetD   	 2
                                  5       WidgetE
5	        B                 6	WidgetF   	 5
                                  7       WidgetG
```

### 完全外部联接


有时候也仅称为外部联接，不过此术语可以指代左外部联接、右外部联接或完全外部联接。为了定义含义，我们使用完整名称：完全外部联接。

使用完全外联接查看匹配的数据，以及两个表中不匹配的数据。联接的类型包括来自两个表中的所有行。例如，如果您对 `safety-rating` 和 `widget` 表执行完全外部联接，则会返回所有行。行在匹配的位置对齐，所有额外的数据包含在单独的行中。在结果集中，您可以看到没有匹配数据的空白。

```
SELECT * FROM safety-rating
FULL OUTER JOIN widget
ON safety_rating.rating_id = widget.safety_rating_id

rating_id    safety_rating    widget_id   widget         safety_rating_id
1	        A+                2	WidgetB   	1
1	        A+                3	WidgetC   	1
2	        A                 4	WidgetD   	2
3	        A-                1	WidgetA   	3
4	        B+
5	        B                 6	WidgetF   	5
                                  5	WidgetE
                                  7	WidgetG
```