2013-05-11 112 views
0

如果可能,我正在查找单个更新语句。SQL Server 2008 - 根据行的相似分组的列更新列

考虑:

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 

我需要一个RSVP组中要更新isVIP为客人如果他们的“领头羊” isVip = 1

因此,在这种情况下排,2和3以上将被更新0到1行4个,5将保持不变

回答

1
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' 

产量一直执行

╔═══════════╦══════════╦═══════╦═══════════╦══════════╦════════╗ 
║ 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 ║ 
╚═══════════╩══════════╩═══════╩═══════════╩══════════╩════════╝ 
+0

aswesome!很好的触摸与sqlfiddle – DMoney 2013-05-11 18:58:19

0

这里使用的窗口功能和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; 
+0

我juse了解了关于cte,这是一个伟大的用途,谢谢。 – DMoney 2013-05-11 18:58:52