

# MERGE INTO
<a name="merge-into-statement"></a>

有条件地更新行、删除行或将行插入到 Apache Iceberg 表中。单个语句可以组合更新、删除和插入操作。

**注意**  
`MERGE INTO` 是事务性的，仅支持用于 Athena 引擎版本 3 中的 Apache Iceberg 表。

## 摘要
<a name="merge-into-statement-synopsis"></a>

要从 Iceberg 表中有条件地更新、删除或插入行，请使用以下语法。

```
MERGE INTO target_table [ [ AS ]  target_alias ]
USING { source_table | query } [ [ AS ] source_alias ]
ON search_condition
{{when_clause}} [...]
```

{{when\_clause}} 是以下语法之一：

```
WHEN MATCHED [ AND condition ]
    THEN DELETE
```

```
WHEN MATCHED [ AND condition ]
    THEN UPDATE SET ( column = expression [, ...] )
```

```
WHEN NOT MATCHED [ AND condition ]
    THEN INSERT ({{column_name}}[, {{column_name}} ...]) VALUES (expression, ...)
```

`MERGE` 支持任意数量的具有不同 `MATCHED` 条件的 `WHEN` 子句。条件子句会执行 `MATCHED` 状态和匹配条件所选择的第一个 `WHEN` 子句中的 `DELETE`、`UPDATE` 或 `INSERT` 操作。

对于每个源行，`WHEN` 子句会按顺序处理。仅执行第一个匹配的 `WHEN` 子句。后续子句将忽略。如果单个目标表行与多个源行匹配，会引发用户错误。

如果源行与任何 `WHEN` 子句均不匹配且没有 `WHEN NOT MATCHED` 子句，则会忽略源行。

在具有 `UPDATE` 操作的 `WHEN` 子句中，列值表达式可以引用目标或源的任何字段。如果是 `NOT MATCHED` 字句，`INSERT` 表达式可以引用源的任何字段。

**示例**  
如果第一个表中不存在行，则以下示例会将第二个表中的行合并到第一个表中。请注意，`VALUES` 子句中列出的列必须以源表别名为前缀。`INSERT` 子句中列出的目标列*不得*以此为前缀。

```
MERGE INTO iceberg_table_sample as ice1
USING iceberg2_table_sample as ice2
ON ice1.col1 = ice2.col1
WHEN NOT MATCHED 
THEN INSERT (col1)
      VALUES (ice2.col1)
```

有关更多 `MERGE INTO` 示例，请参阅 [更新 Iceberg 表数据](querying-iceberg-updating-iceberg-table-data.md)。