如果不存在则更新语句

Lam*_*lan 0 sql-server t-sql update sql-server-2014

如果我有一个包含 2 列的简单表和一个由两列组成的复合主键,我该如何重命名其中一列,但前提是它不会导致主冲突?

这是一个简化的示例。

拿下表:

User  | Role
------|----------------
Joe   | User
Joe   | Administrator
Brian | User
Anna  | Administrator
Anna  | Admin
Run Code Online (Sandbox Code Playgroud)

假设我想编写以下查询:

UPDATE UserRoles Set Role = 'Admin' WHERE Role = 'Administrator'
Run Code Online (Sandbox Code Playgroud)

在不使用游标的情况下,如何更改 SQL 更新语句以避免重命名 Anna(因为该用户已经具有 Admin 角色),但仍重命名 Joe?

甚至可以使用基于集合的 SQL 还是使用游标是唯一的方法?

谢谢。

a1e*_*x07 5

一种方法是

UPDATE a
SET [Role]= 'Admin' 
FROM UserRoles a
WHERE a.[Role]= 'Administrator'
AND NOT EXISTS 
  (
       SELECT NULL 
       FROM dbo.UserRoles b 
       WHERE b.[User] = a.[User] AND b.[Role] = 'Admin'
  );
Run Code Online (Sandbox Code Playgroud)