SQL更新记录查询开发需求:两类Schema关联场景的字段填充问题
针对两类跨Schema数据同步的SQL更新方案
场景1:flag='yes'时同步prodct name字段
需求拆解
当两个Schema(前缀一致,一个带_t后缀、一个不带)下的同名表中,flag='yes'的记录里,只要其中一条的prodct name非空,就把非空值同步到另一条的空字段;若两者都为空则不更新。
实现语句(以MySQL为例,其他数据库可微调)
假设表的唯一标识字段为id(需替换为实际业务主键/唯一键):
-- 更新不带_t的Schema中的表 UPDATE sample.target_table t1 JOIN sample_t.target_table t2 ON t1.id = t2.id SET t1.`prodct name` = COALESCE(t1.`prodct name`, t2.`prodct name`) WHERE t1.flag = 'yes' AND t2.flag = 'yes' AND (t1.`prodct name` IS NULL OR t2.`prodct name` IS NULL) AND COALESCE(t1.`prodct name`, t2.`prodct name`) IS NOT NULL; -- 反向更新带_t的Schema中的表 UPDATE sample_t.target_table t2 JOIN sample.target_table t1 ON t2.id = t1.id SET t2.`prodct name` = COALESCE(t2.`prodct name`, t1.`prodct name`) WHERE t2.flag = 'yes' AND t1.flag = 'yes' AND (t2.`prodct name` IS NULL OR t1.`prodct name` IS NULL) AND COALESCE(t2.`prodct name`, t1.`prodct name`) IS NOT NULL;
逻辑说明
COALESCE(a,b)返回第一个非空值,确保只将非空值填充到空字段- 用唯一标识字段关联,保证匹配的是同一条业务记录
- 最后一个条件过滤掉两者都为空的情况,避免无效更新
场景2:flag='No'时同步Domain、sme、prodct name字段
需求拆解
当两个Schema(前缀一致,一个带_t后缀、一个不带)下的同名表中,flag='No'的记录里,将非空记录的字段值填充到对应空字段;字段已填充或两者都为空则不更新。
实现语句(以MySQL为例)
同样基于唯一标识字段关联,对每个字段单独处理:
-- 更新不带_t的Schema中的表 UPDATE sample.target_table t1 JOIN sample_t.target_table t2 ON t1.id = t2.id SET t1.Domain = COALESCE(t1.Domain, t2.Domain), t1.sme = COALESCE(t1.sme, t2.sme), t1.`prodct name` = COALESCE(t1.`prodct name`, t2.`prodct name`) WHERE t1.flag = 'No' AND t2.flag = 'No' -- 仅当至少有一个字段需要更新时执行 AND ( t1.Domain IS NULL OR t1.sme IS NULL OR t1.`prodct name` IS NULL OR t2.Domain IS NULL OR t2.sme IS NULL OR t2.`prodct name` IS NULL ); -- 反向更新带_t的Schema中的表 UPDATE sample_t.target_table t2 JOIN sample.target_table t1 ON t2.id = t1.id SET t2.Domain = COALESCE(t2.Domain, t1.Domain), t2.sme = COALESCE(t2.sme, t1.sme), t2.`prodct name` = COALESCE(t2.`prodct name`, t1.`prodct name`) WHERE t2.flag = 'No' AND t1.flag = 'No' AND ( t2.Domain IS NULL OR t2.sme IS NULL OR t2.`prodct name` IS NULL OR t1.Domain IS NULL OR t1.sme IS NULL OR t1.`prodct name` IS NULL );
关联条件说明
- 核心关联逻辑是两个表的唯一标识字段(如
id),确保同步的是同一条业务记录;若无单一主键,可使用多字段组合的唯一键(如code + type) COALESCE函数保证:仅当目标字段为空时,才用另一表的非空值填充,已有的值不会被覆盖
通用注意事项
- 执行更新前务必用
SELECT验证范围,比如场景1的验证语句:
SELECT t1.id, t1.`prodct name` AS t1_name, t2.`prodct name` AS t2_name FROM sample.target_table t1 JOIN sample_t.target_table t2 ON t1.id = t2.id WHERE t1.flag = 'yes' AND t2.flag = 'yes' AND (t1.`prodct name` IS NULL OR t2.`prodct name` IS NULL) AND COALESCE(t1.`prodct name`, t2.`prodct name`) IS NOT NULL;
- PostgreSQL、SQL Server等数据库语法略有差异(如PostgreSQL用
UPDATE ... FROM),需根据实际数据库调整 - 含空格的字段名需用反引号(MySQL)或双引号(PostgreSQL/SQL Server)包裹
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

