【发布时间】:2014-10-26 06:10:56
【问题描述】:
我在 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
【问题讨论】:
-
我不明白更新Rank_列的规则。你能澄清一下吗?
-
您有使用 CTE 的示例吗?我试过了,但我无法让它工作。
-
我还更新了 Rank_ 规则,但本质上如果 rcd 的值低于正在更新的 rcd,则更新该字段,否则忽略。
-
您的联接为
#table1中的每一行返回多行。 UPDATE 必须唯一确定应该更新哪些数据。 -
我看不出 John Mike Davis 的 Rank_ 是如何从 2 变为 1。请解释一下。
标签: sql sql-server sql-update common-table-expression