简体   繁体   English

SQL Server 2008-根据类似行分组的列更新列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM