在多个连接条件下将数据从第二个表插入一个表

Posted

技术标签:

【中文标题】在多个连接条件下将数据从第二个表插入一个表【英文标题】:Inserting data into one table from second table on multiple join condition 【发布时间】:2020-02-26 20:45:56 【问题描述】:

我正在尝试使用连接键字段将数据从第二个表 (src_tbl) 插入到一个表 (trgt_tbl) 中。查询似乎工作正常,但速度极慢。 trgt_tbl 中有大约 1600 万条记录,来自 src_tbl 的每日增量负载预计将有大约 50 万条记录。我正在尝试弄清楚我是否可以以更好的方式做到这一点。

注意:合并不是一个选项,因为数据是插入到 Redshift 中的,而 Redshift 不支持合并。

INSERT INTO trgt_tbl (col1,
    col2,
    col3,
    col4,
    col5,
    col6)
SELECT col1,
    col2,
    col3,
    col4,
    col5,
    col6 
FROM  src_tbl s  
WHERE NOT EXISTS (
    SELECT 1 
    FROM trgt_tbl t 
    WHERE 
        t.col1 = s.col1 
        OR t.col2 = s.col2 
        OR t.col3 = s.col3
        OR t.col4 = s.col4 
)

【问题讨论】:

你的实际目标是什么?您是否想做相当于UPSERT 的操作?您查看过Updating and Inserting New Data - Amazon Redshift 中的示例吗? 是的,这是一个 upsert。 但我正在尝试使用多个键来处理 upsert,这是一个挑战。 怎么样:Upsert in redshift 我尝试过这种方式,但收到错误消息:无效操作:关系“trgt_tbl”不存在; 【参考方案1】:

正如Database Developer Guide 中提到的那样,由于缺少对merge / upsert 的支持,您应该在临时表的帮助下使用更新和插入的组合来有效地执行合并。例如。您可以执行以下操作:

使用来自src_tbl 的数据创建一个临时表:

create temp table staging (like target); 
insert into staging select s.col1, s.col2, s.col3, s.col4, s.col5, s.col6 from src_tbl s JOIN trgt_tbl t ON 
    t.col1 = s.col1 
    OR t.col2 = s.col2 
    OR t.col3 = s.col3
    OR t.col4 = s.col4;

内连接暂存表以从trgt_tbl 中删除正在更新的行并插入暂存表中的行:

begin transaction;

delete from trgt_tbl using staging where t.col1 = s.col1 OR t.col2 = stage.col2 OR t.col3 = stage.col3 OR t.col4 = stage.col4; 
insert into trgt_tbl select * from staging;

end transaction;

【讨论】:

非常感谢您的回答。但我的源表已经在 Redshift 中,并且每天都会使用增量记录更新,仅针对需要在目标表中更新、插入或删除的最后一天。因此,我认为没有必要创建另一个临时表来执行相同的连接。如果我遗漏了什么,请告诉我。

以上是关于在多个连接条件下将数据从第二个表插入一个表的主要内容,如果未能解决你的问题,请参考以下文章

使用第一个表的输出从第二个表中选择特定数据

索引视图中完全外连接的替代方案

如何在 EF / EF Core 中的第二个表上实现具有某些条件的左连接?

Microsoft SQL 查询 - 从第二个表返回最后一条记录

从第二个表存储过程mysql中仅通过其ID选择一个图像

EXISTS 没有第二个表连接(自连接)