

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://www.amazonaws.cn/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 通过在不使用 MERGE 的情况下指定列列表执行合并操作
<a name="merge-specify-a-column-list"></a>

当您运行此过程中详述的合并操作时，请将所有步骤放在单个事务中。如果任何步骤失败，事务将回滚。使用单个事务还将减少提交次数，从而节省时间和资源。

**通过指定列列表执行合并操作**

1. 将整个操作放在单个事务块中。

   ```
   BEGIN transaction;
   … 
   END transaction;
   ```

1. 创建暂存表，然后使用要合并的数据填充它，如下面的伪代码所示。

   ```
   create temp table stage (like target); 
   insert into stage 
   select * from source 
   where source.filter = 'filter_expression';
   ```

1. 使用与暂存表的内部联接更新目标表。
   + 在 UPDATE 子句中，显式列出要更新的列。
   + 执行与暂存表的内部联接。
   + 如果分配键与主键不同且分配键将不会更新，请在分配键上添加一个冗余联接。要验证查询是否将使用并置联接，请使用 [EXPLAIN](r_EXPLAIN.md) 运行查询并检查所有联接上是否有 DS\$1DIST\$1NONE。有关更多信息，请参阅[评估查询计划](c_data_redistribution.md)。
   + 如果目标表按时间戳排序，请添加谓词以对目标表使用限定范围的扫描。有关更多信息，请参阅 [设计查询的 Amazon Redshift 最佳实践](c_designing-queries-best-practices.md)。
   + 如果您将不在合并中使用所有行，请添加一个子句以筛选要更改的行。例如，添加针对一个或多个列的不等于筛选器以排除未更改的行。
   + 将更新、删除和插入操作放在单个事务块中，以便在出现问题时回滚所有内容。

    例如：

   ```
   begin transaction;
   
   update target 
   set col1 = stage.col1, 
   col2 = stage.col2, 
   col3 = 'expression' 
   from stage 
   where target.primarykey = stage.primarykey 
   and target.distkey = stage.distkey 
   and target.col3 > 'last_update_time' 
   and (target.col1 != stage.col1 
   or target.col2 != stage.col2 
   or target.col3 = 'filter_expression');
   ```

1. 使用与目标表的内部联接从暂存表中删除不需要的行。目标表中的一部分行已经与暂存表中的对应行匹配，而另一些行已在上一个步骤中更新。在任一情况下，都不需要插入它们。

   ```
   delete from stage 
   using target 
   where stage.primarykey = target.primarykey;
   ```

1. 插入暂存表中的剩余行。在 VALUES 子句中使用您在步骤 2 的 UPDATE 语句中使用的同一列列表。

   ```
   insert into target
   (select col1, col2, 'expression'
   from stage);
   
   end transaction;
   ```

1. 删除暂存表。

   ```
   drop table stage;
   ```