我有一个验证过程,它会以这种格式返回数据,
DECLARE @MyDbTable TABLE (Id int, ACTION varchar(10))
它包括2个字段。为简洁起见,省略了其他字段。此MyDbTable
包括“插入”,“更新”,“忽略”操作。假设我有以下数据,
INSERT INTO @MyDbTable (Id, ACTION)
VALUES (1, 'Insert')
INSERT INTO @MyDbTable (Id, ACTION)
VALUES (1, 'Insert')
INSERT INTO @MyDbTable (Id, ACTION)
VALUES (2, 'Insert')
INSERT INTO @MyDbTable (Id, ACTION)
VALUES (2, 'Insert')
INSERT INTO @MyDbTable (Id, ACTION)
VALUES (2, 'Insert')
INSERT INTO @MyDbTable (Id, ACTION)
VALUES (2, 'Insert')
INSERT INTO @MyDbTable (Id, ACTION)
VALUES (2, 'Ignore')
我只需要考虑'插入'动作。每个Id只有1个动作,“插入”动作,其他应该是“更新”。这是我正在寻找的最终结果,
Id ACTION
1 Insert
1 Update
2 Insert
2 Update
2 Update
2 Update
2 Ignore
如何更新@MyDbTable以达到上述效果。
答案 0 :(得分:2)
您可以使用CTE和ROW_NUMBER
:
WITH toUpdate AS
(
SELECT Id, Action,
rn = row_number() over (partition by t.id order by ID, Action)
FROM MyDbTable t
WHERE ACTION = 'Insert'
)
UPDATE d
SET ACTION = 'Update'
FROM toUpdate d
WHERE RN > 1;