

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

# ID 映射表分析规则
<a name="analysis-rules-id-mapping-table"></a>

在中 AWS Clean Rooms，*ID 映射表分析规则*不是独立的分析规则。这种类型的分析规则由管理 AWS Clean Rooms 并用于连接不同的身份数据以方便查询。它会自动添加到 ID 映射表中，并且无法编辑。它会继承协作中其他分析规则的行为，前提是这些分析规则是同构分析规则。

ID 映射表分析规则对 ID 映射表强制执行安全措施。它限制协作成员使用 ID 映射表直接选择或检查两个成员数据集之间的非重叠人群。当在查询中与其他分析规则一起隐式使用时，ID 映射表分析规则用于保护 ID 映射表中的敏感数据。

使用 ID 映射表分析规则，在展开的 SQL 中 AWS Clean Rooms 强制执行 ID 映射表两侧的重叠。这样做可让您执行以下任务：
+ 在 JOIN 语句中使用 ID 映射表的重叠部分。

  AWS Clean Rooms 允许在 ID 映射表上使用INNERLEFT、或RIGHT联接，前提是它尊重重叠之处。为了保护敏感的映射信息，ID 映射表必须始终位于任何JOIN操作的 inner “” 端。例如，以下JOIN操作是有效的：
  + table LEFT JOIN id\$1mapping\$1table
  + id\$1mapping\$1table RIGHT JOIN table
  + table INNER JOIN id\$1mapping\$1table

  以下JOIN操作无效：
  + id\$1mapping\$1table LEFT JOIN table
  + table RIGHT JOIN id\$1mapping\$1table

  这样可以防止数据集中没有相应匹配项的映射记录被泄露。允许此类操作可能会泄露有关其他协作成员数据映射的敏感信息。
+ 在 JOIN 语句中使用映射表列。

  不能在以下语句中使用映射表列：SELECT、WHERE、HAVING、GROUP BY、或 ORDER BY（除非修改了源 ID 命名空间关联或目标 ID 命名空间关联的保护）。
+ 在扩展的 SQL 中， AWS Clean Rooms 还支持OUTERJOINJOIN、隐式和 CROSS JOIN。这些联接无法满足重叠要求。而是 AWS Clean Rooms 使用`requireOverlap`来指定必须连接哪些列。

支持的查询结构和语法在 [ID 映射表查询结构和语法](#id-mapping-table-query-controls) 中定义。

[ID 映射表分析规则查询控制](#parameters-id-mapping-query-controls) 中定义的分析规则的参数包括查询控制和查询结果控制。其查询控制包括要求在 JOIN 语句中使用 ID 映射表重叠部分的功能（即 `requireOverlap`）。

**Topics**
+ [ID 映射表查询结构和语法](#id-mapping-table-query-controls)
+ [ID 映射表分析规则查询控制](#parameters-id-mapping-query-controls)
+ [ID 映射表的分析规则预定义结构](#id-mapping-table-predefined-structure)
+ [ID 映射表分析规则 - 示例](#id-mapping-table-example)

## ID 映射表查询结构和语法
<a name="id-mapping-table-query-controls"></a>

对具有 ID 映射表分析规则的表的查询必须遵循以下语法。

```
--select_list_expression
SELECT 
provider.data_col, consumer.data_col 

--table_expression
FROM provider

JOIN idMappingTable idmt ON provider.id = idmt.sourceId

JOIN consumer ON consumer.id = idmt.targetId
```

### 协作表
<a name="collab-table-structure"></a>

下表表示 AWS Clean Rooms 协作中存在的已配置表。**cr\$1drivers\$1license** 和 **cr\$1insurance** 表中的 **id** 列都表示与 ID 映射表匹配的列。

**cr\$1drivers\$1license**


|  |  |  | 
| --- |--- |--- |
| id | 司机姓名 | 注册状态 | 
| 1 | 爱德华 | TX | 
| 2 | 达纳 | MA | 
| 3 | Gweneth | IL | 

**cr\$1insurance**


|  |  |  | 
| --- |--- |--- |
| id | 保单持有人\$1电子邮件 | 保单编号 | 
| a | eduardo@internal.company.com | 17f9d04e-f5be-4426-bdc4-250ed59c6529 | 
| b | gwen@internal.company.com | 3f0092db-2316-48a8-8d44-09cf8f6e6c64 | 
| c | rosa@internal.company.com | d7692e84-3d3c-47b8-b46d-a0d5345f0601 | 

### ID 映射表
<a name="id-mapping-table-structure"></a>

下表显示了在 **cr\$1drivers\$1license** 和 **cr\$1insurance** 表上匹配的现有 ID 映射表。并非所有条目都 IDs 适用于两个协作表。


|  |  | 
| --- |--- |
| cr\$1drivers\$1license\$1id | cr\$1insurance\$1id | 
| 1 | a | 
| 2 | null | 
| 3 | b | 
| null | c | 

ID 映射表分析规则仅允许对一组重叠数据运行查询，重叠数据如下所示：


|  |  |  |  |  |  | 
| --- |--- |--- |--- |--- |--- |
| cr\$1drivers\$1license\$1id | cr\$1insurance\$1id | 司机姓名 | 注册状态 | 保单持有人\$1电子邮件 | 保单编号 | 
| 1 | a | 爱德华 | TX | eduardo@internal.company.com | 17f9d04e-f5be-4426-bdc4-250ed59c6529 | 
| 3 | b | Gweneth | IL | gwen@internal.company.com | 3f0092db-2316-48a8-8d44-09cf8f6e6c64 | 

### 示例查询
<a name="id-mapping-table-example-queries"></a>

以下示例显示了 ID 映射表联接的有效位置：

```
-- Single ID mapping table
SELECT
    [ select_items ]FROM
    cr_drivers_license cr_dl
    [ INNER | LEFT ] JOIN cr_identity_mapping_table idmt ON idmt.cr_drivers_license_id = cr_dl.id
    [ INNER | RIGHT ] JOIN cr_insurance cr_in            ON idmt.cr_insurance_id       = cr_in.id
;
-- Single ID mapping table (Subquery)
SELECT
    [ select_items ]FROM (
    SELECT
        [ select_items ]
    FROM
        cr_drivers_license cr_dl
        [ INNER | LEFT ] JOIN cr_identity_mapping_table idmt ON idmt.cr_drivers_license_id = cr_dl.id
        [ INNER | RIGHT ] JOIN cr_insurance cr_in            ON idmt.cr_insurance_id       = cr_in.id
)
;
-- Single ID mapping table (CTE)
WITH
    matched_ids AS (
        SELECT
            [ select_items ]
        FROM
            cr_drivers_license cr_dl
            [ INNER | LEFT ] JOIN cr_identity_mapping_table idmt ON idmt.cr_drivers_license_id = cr_dl.id
            [ INNER | RIGHT ] JOIN cr_insurance cr_in            ON idmt.cr_insurance_id       = cr_in.id
    )SELECT
    [ select_items ]FROM
    matched_ids
;
```

### 注意事项
<a name="id-mapping-table-considerations"></a>

关于 ID 映射表查询的结构和语法，请注意以下几点：
+ 您不能对其进行编辑。
+ 默认情况下，它会应用于 ID 映射表。
+ 它在协作内部使用源和目标 ID 命名空间关联。
+ 默认情况下，ID 映射表配置为向来自 ID 命名空间的列提供默认保护。您可以修改此配置，以便来自 ID 命名空间（`sourceID` 或 `targetID`）的列可以出现在查询中的任何位置。有关更多信息，请参阅 [ID 中的命名空间 AWS Clean Rooms](working-with-id-namespaces.md)。
+ ID 映射表分析规则将继承协作中其他分析规则的 SQL 限制。

## ID 映射表分析规则查询控制
<a name="parameters-id-mapping-query-controls"></a>

使用 ID 映射表查询 AWS Clean Rooms 控件，控制如何使用表中的列来查询表。例如，它可以控制哪些列用于联接，哪些列需要重叠。ID 映射表分析规则还包括允许在不需要 JOIN 的情况下投影 `sourceID` 和/或 `targetID` 的功能。

下表介绍了每种控制。


| 控件 | 定义 | 用法 | 
| --- | --- | --- | 
| joinColumns | 可以查询的成员能在 INNER JOIN 语句中使用的列。 | 除了 INNER JOIN 之外，不能在查询的任何其他部分中使用 joinColumns。有关更多信息，请参阅 [联接控制](analysis-rules-aggregation.md#join-controls)。 | 
| dimensionColumns  | 可以查询的成员能在 SELECT 和 GROUP BY 语句中使用的列（如果有）。 |  可以在 SELECT 和 GROUP BY 中使用的 `dimensionColumn`。 可以显示为 `joinKeys` 的 `dimensionColumn`。 如果使用方括号指定 `dimensionColumns`，则只能在 JOIN 子句中使用它。  | 
| queryContraints:RequireOverlap |  ID 映射表中必须联接以便可以运行查询的列。  |  必须使用这些列对 ID 映射表和协作表执行 JOIN。  | 

## ID 映射表的分析规则预定义结构
<a name="id-mapping-table-predefined-structure"></a>

ID 映射表分析规则的预定义结构对 `sourceID` 和 `targetID` 应用默认保护。这意味着在查询中必须使用应用了保护的列。

您可以通过以下方式配置 ID 映射表分析规则：
+ `sourceID` 和 `targetID` 均受到保护

  在此配置中，不能同时投影 `sourceID` 和 `targetID`。引用 ID 映射表时，必须在 JOIN 中使用 `sourceID` 和 `targetID`。
+ 仅保护 `targetID`

  在此配置中，不能投影 `targetID`。引用 ID 映射表时，必须在 JOIN 中使用 `targetID`。可以在查询中使用 `sourceID`。
+ 仅保护 `sourceID`

  在此配置中，不能投影 `sourceID`。引用 ID 映射表时，必须在 JOIN 中使用 `sourceID`。可以在查询中使用 `targetID`。
+ `sourceID` 或 `targetID` 均不受保护

  在此配置中，ID 映射表不受可在查询中使用的任何特定强制措施的约束。

以下示例显示了对 `sourceID` 和 `targetID` 应用默认保护的 ID 映射表分析规则的预定义结构。在此示例中，ID 映射表分析规则仅允许对 `sourceID` 列和 `targetID` 列执行 INNER JOIN。

```
{
  "joinColumns": [
    "source_id",
    "target_id"
  ],
  "queryConstraints": [
    {
      "requireOverlap": {
        "columns": [
          "source_id",
          "target_id"
        ]
      }
    }
  ],
  "dimensionColumns": [] // columns that can be used in SELECT and JOIN
}
```

以下示例显示了对 `targetID` 应用保护的 ID 映射表分析规则的预定义结构。在此示例中，ID 映射表分析规则仅允许对 `sourceID` 列执行 INNER JOIN。

```
{
  "joinColumns": [
    "source_id",
    "target_id"
  ],
  "queryConstraints": [
    {
      "requireOverlap": {
        "columns": [
          "target_id"
        ]
      }
    }
  ],
  "dimensionColumns": [
    "source_id"
  ]
}
```

以下示例显示了对 `sourceID` 应用保护的 ID 映射表分析规则的预定义结构。在此示例中，ID 映射表分析规则仅允许对 `targetID` 列执行 INNER JOIN。

```
{
  "joinColumns": [
    "source_id",
    "target_id"
  ],
  "queryConstraints": [
    {
      "requireOverlap": {
        "columns": [
          "source_id"
        ]
      }
    }
  ],
  "dimensionColumns": [
    "target_id"
  ]
}
```

以下示例显示了不对 `sourceID` 或 `targetID` 应用保护的 ID 映射表分析规则的预定义结构。在此示例中，ID 映射表分析规则支持对 `sourceID` 列和 `targetID` 列执行 INNER JOIN。

```
{
  "joinColumns": [
    "source_id",
    "target_id"
  ],
  "queryConstraints": [
    {
      "requireOverlap": {
        "columns": []
      }
    }
  ],
  "dimensionColumns": [
    "source_id",
    "target_id"
  ]
}
```

## ID 映射表分析规则 - 示例
<a name="id-mapping-table-example"></a>

例如，公司可以使用 ID 映射表分析规则来使用多方 LiveRamp 转码，而不是编写引用个人身份信息 (PII) 的长瀑布语句。以下示例演示如何协作 AWS Clean Rooms 使用 ID 映射表分析规则。

A 公司是拥有客户和销售数据的广告商，这些数据将用作源。A 公司还代表合作各方进行转码，并提供 LiveRamp 证书。

B 公司是拥有事件数据的发布者，这些数据将被用作目标。

**注意**  
A 公司或 B 公司均可提供 LiveRamp 转码凭证并执行转码。

为创建支持在协作中运行 ID 映射表分析的协作，两家公司执行以下操作：

1. A 公司创建协作并创建成员身份。添加公司 B ，该公司还在协作中创建成员身份。

1. 公司 A 要么关联现有 ID 命名空间来源，要么 AWS Entity Resolution 数据匹配服务 使用 AWS Clean Rooms 控制台创建新的 ID 命名空间源。

   公司 A 创建一个配置表，其中包含他们的销售数据，以及对应于 ID 映射表中的 `sourceId` 的列。

   ID 命名空间源提供要转码的数据。

1. B 公司要么关联现有 ID 命名空间目标，要么 AWS Entity Resolution 数据匹配服务 使用 AWS Clean Rooms 控制台创建一个新的 ID 命名空间目标。

   公司 B 创建一个配置表，其中包含他们的事件数据，以及对应于 ID 映射表中的 `targetId` 的列。

   ID 命名空间目标不提供要转码的数据，只提供有关 LiveRamp 配置的元数据。

1. 公司 A 发现与协作关联的两个 ID 命名空间，并创建且填充一个 ID 映射表。

1. 公司 A 通过联接 ID 映射表对这两个数据集运行查询。

   ```
   --- this would be valid for Custom or List
   SELECT provider.data_col, consumer.data_col
   FROM provider
     JOIN idMappingTable-123123123123-myMappingWFName idmt 
        ON provider.id = idmt.sourceId
     JOIN consumer 
        ON consumer.id = idmt.targetId
   ```