如何在SQL Server中仅更新MAX列

3
我想在SQL Server中使用静态值更新MAX值的状态列:
生成示例数据的脚本:
CREATE TABLE A
(
seq INT,
TrnId NVARCHAR(MAX),
Status NVARCHAR(10)
)

INSERT INTO A VALUES (1,'A1','A')
INSERT INTO A VALUES (2,'A1','A')
INSERT INTO A VALUES (3,'A1','A')
INSERT INTO A VALUES (4,'A1','P')


INSERT INTO A VALUES (1,'B1','A')
INSERT INTO A VALUES (2,'B1','A')
INSERT INTO A VALUES (3,'B1','A')
INSERT INTO A VALUES (4,'B1','P')


CREATE TABLE #temp
(
TrnId NVARCHAR(MAX)
)

INSERT INTO #temp VALUES ('A1')
INSERT INTO #temp VALUES ('B1')

我在 #temp 表中有 TrnId,我想仅更新 TrnId 为 A1 和 B1 的最大值列,使其状态为 'A'。
2个回答

2

没有使用CTE的示例:

UPDATE A SET A.Status = 'A'
FROM #temp T
INNER JOIN (SELECT TrnId, MAX(seq) as MaxSeq FROM A GROUP BY TrnId) M ON M.TrnId = T.TrnId
INNER JOIN A ON A.TrnId = T.TrnId AND A.seq = M.MaxSeq

1
一种方法使用可更新的CTE:
with toupdate as (
      select a.*,
             row_number() over (partition by trnid order by status desc) as seqnum
      from a
     )
update toupdate
    set status = 'A'
    from toupdate join
         #temp t
         on toupdate.trnid = t.trnid
    where seqnum = 1;

非常感谢。期待您的回答! - Prashant Pimpale
1
@PrashantPimpale. . . 你有注意到它实际上缺少了 where 子句吗? - Yogesh Sharma
@YogeshSharma 是的,完全正确,这就是为什么它显示了8行受影响的原因。 - Prashant Pimpale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接