SQL多次更新单行(逐行)

我正在使用
tsql并且遇到一个问题,我需要根据多个条件对单行进行多次更新.

>按升序排列
>如果列为NULL,无论Rank是什么,我都需要更新.
>如果等级相同,我需要按T2_ID的顺序更新.
>我需要它使用最后更新的输出.

我已尝试使用下面的更新语句,但它只执行第一次更新,其余的都被忽略.这是我正在使用的数据集的示例和期望的结果.

提前致谢!

update a
set Middle = case when a.Rank_ >= b.Rank_ OR a.Middle IS NULL then ISNULL(b.Middle, a.Middle) end,
    LName = case when a.Rank_ >= b.Rank_ OR a.Lname IS NULL then ISNULL(b.LName, a.LName) end,
    Rank_ = case when a.Rank_ >= b.Rank_ then b.Rank_ end
from #temp1 a
inner join #temp2 b on a.fname = b.fname
where 
    b.T2_ID in (select top 100% T2_ID from #temp2 order by T2_ID asc)

表格1:

Fname   Middle  Lname   Rank_
------------------------------
John    NULL    NULL    2

表2:

 T2_ID  Fname   Middle  Lname   Rank_
 --------------------------------------
    1   John    Mike    Doe      3
    2   John    NULL    Smith    1
    3   John    NULL    Davis    1

期望的结果:

Fname   Middle  Lname   Rank_
-------------------------------
John    Mike    Davis   1

最佳答案 单个UPDATE语句只能更新一次记录.

因此,如果我理解正确,您想要的结果只是每个Fname一个记录,对于每个列具有最低等级的非空值,如果是关系,则最高T2_ID?

您只需使用子选择即可实现此目的:

SELECT 
    Fname,

    (SELECT TOP 1 Middle FROM #temp1 b
     WHERE Middle IS NOT NULL AND b.Fname = a.Fname
     ORDER BY Rank_, T2_ID DESC) AS Middle

    (SELECT TOP 1 Lname FROM #temp1 b
     WHERE Lname IS NOT NULL AND b.Fname = a.Fname
     ORDER BY Rank_, T2_ID DESC) AS Lname

    (SELECT TOP 1 Rank_ FROM #temp1 b
     WHERE Rank_ IS NOT NULL AND b.Fname = a.Fname
     ORDER BY Rank_, T2_ID DESC) AS Rank_
FROM
    #temp1 a
GROUP BY
    Fname    /* To get one record per Fname */

然后,您可以使用此选择的结果更新#temp2.

点赞