我的表有这些列
[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>)
答案 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
强>