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

时间:2017-04-21 14:34:59

标签: sql sql-server-2008-r2 subquery

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,程序

2 个答案:

答案 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的记录。