SQL Server 2008 R2
表CIRTB
CIRLogID PrimaryKey
StaffName
StaffID
表StaffTB
StaffID - PrimaryKey
Fullname
DOB
CIN
Program
我StaffID
表中的CIRTB
是空的,所以我需要从Staff
表更新它。
我知道我需要类似下面的内容
update CIRTB
set CIRTB>staffid = (select staffid
from stafftb
where stafftb.fullname = cirtb.Staffname)
where CIRTB.staffid is null
我遇到的一个问题:StaffTB
中有一些重复的全名,dob,程序
答案 0 :(得分:1)
在子选择中使用TOP 1,确保它只返回一行,即使有重复项。
答案 1 :(得分:1)
执行UPDATE
的一种方法是使用CTE
:
;WITH ToUpdate AS (
SELECT t1.StaffID AS t1_StaffID, t2.StaffID AS t2_StaffID,
ROW_NUMBER() OVER (PARTITION BY t2.Fullname
ORDER BY t2.DOB DESC) AS rn
FROM CIRTB AS t1
JOIN StaffTB AS t2 ON t1.StaffName = t2.Fullname
WHERE t1.StaffID IS NULL
)
UPDATE ToUpdate
SET t1_StaffID = t2_StaffID
WHERE rn = 1
CTE
使用ROW_NUMBER
以便按Fullname
选择一条记录。窗口函数的ORDER BY
子句确定在重复的情况下选择哪条记录:自使用DOB DESC
以来,选择了具有最新DOB
的记录。