源表与目标表行级匹配需求:按orig字段匹配并更新version字段
数据表同步解决方案(按匹配键同步并维护version字段)
先明确两张表的结构与初始数据
源表(source_table)
| orig1 | orig2 | orig3 | xref1 | xref2 | xref3 |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 2 | 2 | 2 |
| 1 | 1 | 1 | 3 | 3 | 3 |
| 23 | 23 | 23 | 12 | 12 | 12 |
目标表(target_table)初始数据
| orig1 | orig2 | orig3 | xref1 | xref2 | xref3 | version |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 1 | 1 | 0 |
实现逻辑与SQL代码
咱们的核心需求是以orig1、orig2、orig3作为匹配键,判断源表每行是否在目标表中有对应匹配行,然后按规则追加数据:
- 若匹配:追加源表行,
version字段取目标表对应匹配行的最大版本号+1 - 若不匹配:追加源表行,
version字段设为0
这里用SQL的LEFT JOIN结合聚合函数来实现,具体代码如下(以MySQL为例,其他数据库逻辑类似,仅函数细节可能调整):
-- 插入源表数据到目标表,按规则生成version字段 INSERT INTO target_table (orig1, orig2, orig3, xref1, xref2, xref3, version) SELECT s.orig1, s.orig2, s.orig3, s.xref1, s.xref2, s.xref3, CASE -- 如果目标表存在匹配的键,取最大version加1 WHEN MAX(t.version) IS NOT NULL THEN MAX(t.version) + 1 -- 不存在匹配则设为0 ELSE 0 END AS version FROM source_table s LEFT JOIN target_table t ON s.orig1 = t.orig1 AND s.orig2 = t.orig2 AND s.orig3 = t.orig3 -- 按源表的行分组,确保每行都能被处理 GROUP BY s.orig1, s.orig2, s.orig3, s.xref1, s.xref2, s.xref3;
最终输出表结果
执行上述SQL后,目标表会变成如下数据:
| orig1 | orig2 | orig3 | xref1 | xref2 | xref3 | version |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 1 | 1 | 0 |
| 1 | 1 | 1 | 2 | 2 | 2 | 1 |
| 1 | 1 | 1 | 3 | 3 | 3 | 1 |
| 23 | 23 | 23 | 12 | 12 | 12 | 0 |
逻辑说明
- 源表中前两行的
orig1-3都是(1,1,1),和目标表初始行匹配,所以version取0+1=1 - 源表第三行的
orig1-3是(23,23,23),目标表中没有匹配行,所以version设为0
内容的提问来源于stack exchange,提问作者Teju Priya
相关产品推荐
相关产品推荐

