我有一个验证过程,它将返回这种格式的数据,
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;
关于sql - 只进行一行操作来插入和其他更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26329079/