在多个连接条件下将数据从第二个表插入一个表
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 中的第二个表上实现具有某些条件的左连接?