sql - 只进行一行操作来插入和其他更新?

标签 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 以获得上述结果。

最佳答案

您可以使用 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

关于sql - 只进行一行操作来插入和其他更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26329079/

相关文章:

sql - 使用变量作为列名

sql-server - 为什么DATETIME可以减整数,但DATE类型不能减

使用临时表时 SQL Server 描述第一个结果集失败 (sp_describe_first_result_set)

mysql - SQL USE INDEX 语法错误

sql - 对 Oracle 数据库列执行多个替换操作

mysql - CakePHP 与 MySQL 查询的问题

sql-server - 如何在Mac上使用Docker连接SQL Server?

sql-server - Azure 逻辑应用删除行不起作用

SQL - 如何显示多行结果之间的差异

sql - 逗号连接列的 tSQL UNPIVOT 成多行