Sql Update查询,其中set语句从另一个表获取值

Sql Update查询,其中set语句从另一个表获取值,sql,sql-server-2008-r2,subquery,Sql,Sql Server 2008 R2,Subquery,SQL Server 2008 R2 表CIRTB CIRLogID PrimaryKey StaffName StaffID 表StaffTB StaffID - PrimaryKey Fullname DOB CIN Program 我在CIRTB表中有空的StaffID,因此我需要从Staff表中更新它 我知道我需要像下面这样的东西 update CIRTB set CIRTB>staffid = (select staffid fro

SQL Server 2008 R2

表CIRTB

CIRLogID PrimaryKey
StaffName
StaffID
表StaffTB

StaffID - PrimaryKey
Fullname
DOB
CIN
Program
我在
CIRTB
表中有空的
StaffID
,因此我需要从
Staff
表中更新它

我知道我需要像下面这样的东西

update CIRTB
set CIRTB>staffid = (select staffid 
                     from stafftb 
                     where stafftb.fullname = cirtb.Staffname)
where CIRTB.staffid is null

有一个问题我一直在想:在
StaffTB
中,fullname、dob、program都有一些重复项使用子选择中的TOP 1,确保即使有重复项,它也只返回一行。

执行
更新的一种方法是使用
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
使用
行号
为每个
全名
选择一条记录。窗口函数的<代码>顺序由<函数/代码>子句决定在重复的情况下选择哪个记录:因为使用了代码> DOB DISC < /代码>,选择了最近的<代码> DOB < /代码>。

您使用哪种RDBMS?请考虑在格式化文本中添加示例表数据和预期结果。同时显示您当前的查询尝试