You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:05:16