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
相关产品推荐
相关产品推荐

