如何基于UniqueKey与CheckSum实现History与Feed表的数据同步?
基于History同步Feed表的三种场景实现
不需要用While循环逐行处理,SQL的集合操作效率远高于遍历。以下是两种高效实现方式:
方式一:使用MERGE语句(推荐,一步处理所有场景)
MERGE INTO [Feed] AS Target USING [History] AS Source -- 场景1:UniqueKey+CheckSum已存在,不操作 ON Target.UniqueKey = Source.UniqueKey AND Target.CheckSum = Source.CheckSum -- 场景3:UniqueKey+CheckSum不存在,新增并标记N WHEN NOT MATCHED BY Target THEN INSERT (UniqueKey, Col1, Col2, ..., Col100, CheckSum, Flag) VALUES (Source.UniqueKey, Source.Col1, Source.Col2, ..., Source.Col100, Source.CheckSum, 'N') -- 场景2:UniqueKey存在但CheckSum不同,新增并标记U WHEN MATCHED AND Target.CheckSum != Source.CheckSum THEN INSERT (UniqueKey, Col1, Col2, ..., Col100, CheckSum, Flag) VALUES (Source.UniqueKey, Source.Col1, Source.Col2, ..., Source.Col100, Source.CheckSum, 'U');
代码说明
- 场景1:
ON条件匹配时,MERGE默认不执行任何操作,刚好符合需求。 - 场景3:当Feed表中没有对应
UniqueKey+CheckSum的记录时,插入History表的行并设置Flag='N'。 - 场景2:当
UniqueKey匹配但CheckSum不同时,插入History表的行并设置Flag='U'。
方式二:使用INSERT+条件判断(兼容低版本SQL)
如果你的SQL环境不支持MERGE,可以拆分两个INSERT语句分别处理场景2和3:
-- 处理场景3:新增UniqueKey不存在的记录 INSERT INTO [Feed] (UniqueKey, Col1, ..., Col100, CheckSum, Flag) SELECT UniqueKey, Col1, ..., Col100, CheckSum, 'N' FROM [History] h WHERE NOT EXISTS ( SELECT 1 FROM [Feed] f WHERE f.UniqueKey = h.UniqueKey ); -- 处理场景2:UniqueKey存在但CheckSum不同的记录 INSERT INTO [Feed] (UniqueKey, Col1, ..., Col100, CheckSum, Flag) SELECT h.UniqueKey, h.Col1, ..., h.Col100, h.CheckSum, 'U' FROM [History] h INNER JOIN [Feed] f ON h.UniqueKey = f.UniqueKey WHERE h.CheckSum != f.CheckSum;
注意事项
- 代码中的
Col1到Col100请替换为你实际的列名,尽量避免用SELECT *,防止列顺序变动导致数据错误。 - 建议给Feed表的
UniqueKey字段创建索引,大幅提升匹配查询的效率。
内容的提问来源于stack exchange,提问作者sunny nuri
相关产品推荐
相关产品推荐

