如何基于ID将code3='in'的code1/code2值填充到同ID的code3='out'字段
正确SQL实现方案
方案1:查询生成填充后的结果(不修改原表)
如果只是需要查询出填充后的结果,不需要修改原表,可以用CTE(公共表表达式)提取每个id对应的code3="in"的字段值,再通过关联和COALESCE函数填充空值:
WITH in_records AS ( SELECT id, code1 AS in_code1, code2 AS in_code2 FROM input_table WHERE code3 = 'in' ) SELECT t.id, t.code3, COALESCE(t.code1, ir.in_code1) AS code1, COALESCE(t.code2, ir.in_code2) AS code2 FROM input_table t LEFT JOIN in_records ir ON t.id = ir.id ORDER BY t.id, t.code3;
逻辑说明:
in_records先筛选出所有code3="in"的记录,存储每个id对应的有效code1和code2值。LEFT JOIN确保原表的所有记录都被保留,不会丢失数据。COALESCE函数会优先使用原记录的code1/code2值,只有当原字段为空时,才替换为同id下code3="in"的对应值。
方案2:直接更新原表数据
如果需要直接修改原表,把空值填充完成,可以用UPDATE语句配合子查询:
UPDATE input_table t SET code1 = COALESCE(t.code1, ir.in_code1), code2 = COALESCE(t.code2, ir.in_code2) FROM ( SELECT id, code1 AS in_code1, code2 AS in_code2 FROM input_table WHERE code3 = 'in' ) ir WHERE t.id = ir.id AND t.code3 = 'out' AND (t.code1 IS NULL OR t.code2 IS NULL);
逻辑说明:
- 子查询同样提取每个id的
code3="in"字段值。 - 仅针对
code3="out"且code1/code2为空的记录进行更新,避免修改已有有效值的记录。 - 用
COALESCE保证只有空值才会被替换。
内容的提问来源于stack exchange,提问作者Nitish
相关产品推荐
相关产品推荐

