SQL Server,如何有条件地更新多条记录?

时间:2015-12-20 16:32:23

标签: sql-server

我的表有这些列

[ID] [bigint] IDENTITY(1,1) NOT NULL,
[PersonID] [bigint] NOT NULL,
[B] [bit] NULL

根据PersonID值列表,我想更新表格,将每个B的最新条目的PersonID值设置为1。

下面的脚本只更新了一条记录,但看起来它的相似之处可能有用吗?

  UPDATE table
  SET B = 1
  WHERE PersonID in (<idlist>)
    AND ID IN (Select MAX(ID) FROM table WHERE PersonID in <idlist>)

3 个答案:

答案 0 :(得分:1)

IN (Select MAX(ID) FROM ...)限制为唯一的MAX(ID)。

按PersonID分组,以获取每个人的MAX(ID)。

UPDATE table
  SET B = 1
  WHERE
    ID IN (SELECT MAX(ID)
           FROM table
           WHERE PersonID in (<idlist>)
           GROUP BY PersonID)

答案 1 :(得分:0)

假设id是唯一的,您的子查询只需要一个关联子句:

 UPDATE table t
   SET B = 1
   WHERE t.PersonID in (<idlist>) AND
         ID IN (Select MAX(ID) FROM table t2 WHERE t2.PersonID = t.PersonId);

或者,您可以使用group by,但这可能会更昂贵:

 UPDATE table t
   SET B = 1
   WHERE t.PersonID in (<idlist>) AND
         ID IN (Select MAX(ID)
                FROM table t2
                WHERE t2.PersonID in (<idlist>)
                GROUP BY t2.PersonId
               );

使用row_number()和可更新的CTE是另一种合理的方法。

答案 2 :(得分:0)

您的初始脚本非常接近。只需使用相关子查询:

UPDATE t
SET B = 1
FROM #tab t
WHERE t.PersonID in (<idlist>)
  AND ID IN (SELECT MAX(ID) FROM #tab t2 WHERE t.PersonID = t2.PersonID);

LiveDemo