我正在使用
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.