如何根据行是否已更改执行选择性的SQL插入和更新?

时间:2020-01-16 04:45:28

标签: mysql sql snowflake-cloud-data-platform

我想根据记录是否已更改,将记录从一个表插入另一个表的最有效方法。除了插入操作,还需要执行更新。

一些关键说明。最新记录的 endDate 为2100-12-31,表示该记录是开放式的。 strtDate thetimestamp 的副本。我正在使用Snowflake SQL环境。我无法使用用户定义的功能。


假设我有一个表1

ID      primKey1  primKey2  checkVar1   checkVar2   theTimestamp   strtDate    endDate
100     1         2         302.1       423.5       2001-07-13     2001-07-13  2100-12-31
101     3         6         506.4       236.7       2005-10-25     2005-10-25  2100-12-31

我想插入 Table2

ID      primKey1  primKey2  checkVar1   checkVar2   theTimestamp
100     1         2         302.1       423.5       2001-10-31
101     3         6         767.9       236.7       2006-12-05  

我要检查记录是否已更改的变量是 checkVar1 checkVar2 。在这种情况下, ID = 100 的记录在插入表(Table2)中没有更改,因此我不想插入此记录。但是, ID = 101 确实发生了变化,所以我想插入此记录。

这是Table1现在的外观:

ID      primKey1  primKey2  checkVar1   checkVar2   theTimestamp   strtDate    endDate
100     1         2         302.1       423.5       2001-07-13     2001-07-13  2100-12-31
101     3         6         506.4       236.7       2005-10-25     2005-10-25  *2006-12-05*
101     3         6         767.9       236.7       2006-12-05     2006-12-05  2100-12-31

如您所见,旧记录的 endDate 已更新为新记录的 theTimestamp 。然后,通过采用2100-12-31 endDate ,插入新记录作为旧记录的延续。因此,必须同时具有UPDATE和INSERTION。


我的方法:

WITH newTable2Rows AS (
SELECT DISTINCT ID, primKey1, primKey2
FROM Table2
)

WITH maxTable1Rows AS (
SELECT A.ID, A.primKey1, A.primKey2, A.checkVar1, A.checkVar2, A.theTimestamp, A.strtDate, MAX(A.endDate)
FROM Table1 A
JOIN newTable2Rows B
ON A.ID = B.ID, A.primKey1 = B.primKey1, A.primKey2 = B.primKey
GROUP BY A.ID, A.primKey1, A.primKey2, A.checkVar1, A.checkVar2, A.theTimestamp, A.strtDate
)

INSERT INTO Table1 (
ID, primKey1, primKey2, checkVar1, checkVar2, theTimestamp, strtDate, endDate
)
SELECT
ID, primKey1, primKey2, checkVar1, checkVar2, theTimestamp, theTimestamp AS strtDate, '2100-12-31' AS endDate
FROM Table2
MINUS maxTable1Rows

最后有一些伪代码,因为我还没有完成。但是基本上我想从Table2中减去最大的Table1行,以便从Table2中删除重复的行。这将为我留下来自Table2的唯一更新行。之后,我仍然需要用'2100-12-31'更新表1中的最大行。

问题在于,将完整的行存储到maxTable1Rows表中非常昂贵。我正在处理包含100gb +数据的表。我使用的数据集包含超过2800万条记录和200多个列。因此,我正在寻找一种可以以最有效的方式执行UPDATE和INSERT的方法。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

这不是MERGE语句的简单用法吗? Snowflake MERGE

MERGE使您可以完全控制比较列,并根据您的条件进行插入或更新。

相关问题