Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

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

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

  1. 将整个操作放在单个事务块中,以便在出现问题时回滚所有内容。

    Copy
    begin transaction; … end transaction;
  2. 创建暂存表,然后使用要合并的数据填充它,如下面的伪代码所示。

    Copy
    create temp table stage (like target); insert into stage select * from source where source.filter = 'filter_expression';
  3. 使用与暂存表的内部联接更新目标表。

    • 在 UPDATE 子句中,显式列出要更新的列。

    • 执行与暂存表的内部联接。

    • 如果分配键与主键不同且分配键将不会更新,请在分配键上添加一个冗余联接。要验证查询是否将使用并置联接,请使用 EXPLAIN 运行查询并检查所有联接上是否有 DS_DIST_NONE。有关更多信息,请参阅 评估查询计划

    • 如果目标表按时间戳排序,请添加谓词以对目标表使用限定范围的扫描。有关更多信息,请参阅 查询设计最佳实践

    • 如果您将不在合并中使用所有行,请添加一个子句以筛选需要更改的行。例如,添加针对一个或多个列的不等于筛选器以排除未更改的行。

    • 将更新、删除和插入操作放在单个事务块中,以便在出现问题时回滚所有内容。

    例如:

    Copy
    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');
  4. 使用与目标表的内部联接从暂存表中删除不需要的行。目标表中的一部分行已经与暂存表中的对应行匹配,而另一些行已在上一个步骤中更新。在任一情况下,都不需要插入它们。

    Copy
    delete from stage using target where stage.primarykey = target.primarykey;
  5. 插入暂存表中的剩余行。在 VALUES 子句中使用您在步骤 2 的 UPDATE 语句中使用的同一列列表。

    Copy
    insert into target (select col1, col2, 'expression') from stage; end transaction;
  6. 删除暂存表。

    Copy
    drop table stage;