我想知道根据记录是否已更改将记录从一个表插入到另一个表的最有效方法。除了插入之外,还需要执行更新。
一些关键笔记。最新记录的结束日期为2100-12-31,表示它是开放式的。strtDate是theTimestamp的副本。我正在使用 Snowflake SQL 环境。我无法使用用户定义的函数。
假设我有一个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 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”更新 Table1 中的最大行数。
问题在于将完整行存储到 maxTable1Rows 表中非常昂贵。我正在处理包含 100gb+ 数据的表。我使用的数据集包含超过 2800 万条记录和 200 多列。所以我正在寻找一种可以以最有效的方式执行 UPDATE 和 INSERT 的方法。任何帮助将不胜感激。