如何按特定约束将SQL同表某列数据复制到同列指定行?
问题场景
我需要迁移的数据位于Table1表的example_Date列中,该列被用来存储不同字段ID(Field ID)对应的数据。
原表数据如下:
Table ID Field ID Obj ID Obj Inv example_Date -------------------------------------------------- 1 2 1 3 01/01/1996 1 4 1 3 01/02/1996 1 6 1 3 01/01/1996 1 2 2 4 01/05/1996 1 4 2 4 01/01/1997 1 6 2 4 10/01/1998
需求说明
要将Field ID = 2的example_Date列数据,复制到同表中满足以下条件的行:
- Obj ID 相同
- Obj Inv 相同
- Field ID = 6
更新后的目标结果(*标记为更新的数据):
Table ID Field ID Obj ID Obj Inv example_Date ------------------------------------------------- 1 2 1 3 01/01/1996 1 4 1 3 01/02/1996 1 6 1 3 *01/01/1996 1 2 2 4 01/05/1996 1 4 2 4 01/01/1997 1 6 2 4 *01/05/1996
无效的尝试方案
示例1(无效)
UPDATE ValInvData SET ValStr = ValStr WHERE ValInvData.FieldId = 11061 AND ValInvData.ObjID = ValInvData.ObjId AND ValInvData.ObjInv = ValInvData.ObjInv AND ValInvData.FieldId != 11051 AND ValInvData.FieldId != 11061 AND ValInvData.FieldId != 11062 AND ValInvData.FieldId != 11055 AND ValInvData.FieldId != 11228 AND ValInvData.FieldId != 11230 AND ValInvData.FieldId != 14676;
示例2(无效)
UPDATE ValInvData SET ValStr = (SELECT ValStr FROM ValInvData WHERE Valdata.FieldId = 11061 AND ObjData.ObjID = ValData.ObjId AND ValInvData.ObjInv = ValInvData.ObjInv AND ValInvData.FieldId != 11051 AND ValInvData.FieldId != 11061 AND ValInvData.FieldId != 11062 AND ValInvData.FieldId != 11055 AND ValInvData.FieldId != 11228 AND ValInvData.FieldId != 11230 AND ValInvData.FieldId != 14676);
最终解决方案
update ValInvData set ValStr = coalesce( ( select min(ValStr) -- 确保只返回一个值,也可以考虑在无匹配时抛出错误 from ValInvData as vid where vid.ObjId = ValInvData.ObjId and vid.ObjInv = ValInvData.ObjInv and vid.FieldId = 11061 ), ValInvData.ValStr) -- 也可以用exists子查询先确认存在匹配行 where FieldId = 11229;
内容的提问来源于stack exchange,提问作者Chester S.
相关产品推荐
相关产品推荐

