[英]SQL Server 2008 - update a column based on a column of similar grouping of row
I am looking for a single update statement if possible. 如果可能,我正在寻找一条更新声明。
Consider: 考虑:
rsvpgroup | personid | isVip | firstname | lastname | type
------------------------------------------------------------------
1 100 1 bob smith leader
1 101 0 john doe guest
1 102 0 sara jones guest
2 200 0 tom ohara leader
2 201 0 jane doe guest
I need to update isVIP
for guest in an rsvp group if their "leader" isVip=1 如果他们的“领导者” isVip = 1,我需要为rsvp组中的访客更新
isVIP
So in this scenario rows, 2 and 3 above will be updated from 0 to 1. Rows 4, 5 will remain unchanged 因此,在这种情况下,上面的第2和3行将从0更新为1。第4、5行将保持不变
UPDATE a
SET a.isVip = 1
FROM TableName a
INNER JOIN TableName b
ON a.rsvpgroup = b.rsvpgroup AND
b.[type] = 'leader' AND
b.isVip = 1
WHERE a.[type] = 'guest'
OUTPUT after update statement has been executed 执行更新语句后的输出
╔═══════════╦══════════╦═══════╦═══════════╦══════════╦════════╗
║ RSVPGROUP ║ PERSONID ║ ISVIP ║ FIRSTNAME ║ LASTNAME ║ TYPE ║
╠═══════════╬══════════╬═══════╬═══════════╬══════════╬════════╣
║ 1 ║ 100 ║ 1 ║ bob ║ smith ║ leader ║
║ 1 ║ 101 ║ 1 ║ john ║ doe ║ guest ║
║ 1 ║ 102 ║ 1 ║ sara ║ jones ║ guest ║
║ 2 ║ 200 ║ 0 ║ tom ║ ohara ║ leader ║
║ 2 ║ 201 ║ 0 ║ jane ║ doe ║ guest ║
╚═══════════╩══════════╩═══════╩═══════════╩══════════╩════════╝
Here is an approach using window functions and CTE: 这是使用窗口函数和CTE的方法:
with toupdate as (
select t.*,
max(case when [type] = 'leader' then IsVIP end) over
(partition by RSVPgroup) as LeaderIsVIP
from t
)
update toupdate
set IsVIP = LeaderIsVIP
where IsVIP <> LeaderIsVIP;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.