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

SQL更新问题:如何将Tb2的NULL ID字段与Tb1对应ID匹配更新?

问题根源与解决方法

你的脚本出现错误的核心原因是**ISNULL(Tb2.Birthdate, '')的隐式类型转换**:
因为Birthdate是日期类型,当你把空字符串''作为ISNULL的替代值时,SQL会自动将空字符串转换为日期类型的1900-01-01。这就导致:

  • Tb2中Birthdate为NULL的Ball记录,转换后的值是1900-01-01;
  • Tb2中Birthdate为1900-01-01的Ball记录,转换后的值也是1900-01-01;
    同时Tb1中两条Ball记录的转换结果也都是1900-01-01,最终导致Tb2的两条Ball记录都能匹配到Tb1的两条Ball记录,UPDATE时SQL会随机选取一个匹配的ID赋值,从而出现两条ID=1的错误结果。

另外你的UPDATE语法也存在错误,SQL Server中正确的联表UPDATE语法应该是UPDATE 表名 SET 列=值 FROM ...。

正确的更新脚本

UPDATE Tb2
SET ID = Tb1.ID
FROM Tb2
INNER JOIN Tb1 
    ON Tb2.Name = Tb1.Name
    AND (
        -- 匹配非NULL且相等的Birthdate
        Tb2.Birthdate = Tb1.Birthdate
        -- 同时匹配两边都为NULL的情况
        OR (Tb2.Birthdate IS NULL AND Tb1.Birthdate IS NULL)
    )
WHERE Tb2.ID IS NULL

如果你的SQL Server版本是2022及以上,也可以使用更简洁的IS NOT DISTINCT FROM运算符,它会自动处理NULL相等的情况:

UPDATE Tb2
SET ID = Tb1.ID
FROM Tb2
INNER JOIN Tb1 
    ON Tb2.Name = Tb1.Name
    AND Tb2.Birthdate IS NOT DISTINCT FROM Tb1.Birthdate
WHERE Tb2.ID IS NULL

内容的提问来源于stack exchange,提问作者Jeff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:11:07