我有两个表
Tb1
ID Name Birthdate
--------------------
1 Ball NULL
2 Tire 2022-01-01
3 Ball 1900-01-01
Tb2
ID Name Birthdate
------------------------
NULL Ball NULL
NULL Tire 2022-01-01
NULL Ball 1900-01-01
我想更新Tb2.ID
跟随Tb1.ID
,所以这里是我的脚本
UPDATE Tb2.ID = Tb1.ID
FROM Tb2
LEFT JOIN Tb1 ON Tb2.Name = Tb1.Name
AND ISNULL (Tb2.Birthdate, '') = ISNULL (Tb1.Birthdate, '')
WHERE Tb2.ID IS NULL
结果是ID 1在Tb2中有2行如下表
生日 2022-01-011900-01-01
尝试:
UPDATE Tb2
SET Tb2.ID = Tb1.ID
FROM Tb2
LEFT JOIN Tb1
ON Tb2.Name = Tb1.Name
AND ISNULL(Tb2.Birthdate,'9999-12-31') = ISNULL(Tb1.Birthdate,'9999-12-31')
WHERE Tb2.ID IS NULL
我认为空字符串转换为1900-01-01在你的ISNULLs,使用无效的(但不是1900-01-01)日期为NULL出生日期将解决这个问题。
如果您正在使用SQL Server 2022(或更高版本),您也可以使用新的IS [NOT] DISTINCT FROM
语法。这允许比较空值和非空值。
UPDATE Tb2
SET ID = Tb1.ID
FROM Tb2
JOIN Tb1
ON Tb2.Name = Tb1.Name
AND Tb2.Birthdate IS NOT DISTINCT FROM Tb1.Birthdate
WHERE Tb2.ID IS NULL
请注意,这里不需要左连接,因为您实际上只希望在匹配时进行更新。请使用内连接。
请参阅此数据库<>小提琴,以获取DISTINCT FROM
的快速演示。