我想根据记录是否已更改,将记录从一个表插入另一个表的最有效方法。除了插入操作,还需要执行更新。
一些关键说明。最新记录的 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的方法。任何帮助将不胜感激。