只插入一行动作以及其他更新?

时间:2014-10-12 19:26:25

标签: sql sql-server sql-server-2012

我有一个验证过程,它会以这种格式返回数据,

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以达到上述效果。

1 个答案:

答案 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;

Demo