Sql Update查询,其中set语句从另一个表获取值
SQL Server 2008 R2 表CIRTBSql 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
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?请考虑在格式化文本中添加示例表数据和预期结果。同时显示您当前的查询尝试