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

如何按特定约束将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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:13:14