我有一个验证过程,它将以这种格式返回数据,
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以实现上述结果。
您可以通过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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句