[英]Update if not exists in SQL Server?
有什么方法可以在 SQL Server 中运行跳过目标中已存在的行的update
语句?
例如,我有一个视图vw_BranchCaseCurrent
,它包含一个CaseID
和一个BranchID
,以及一个自动递增的ID
。 我想做这个:
update a
set
a.CaseID = @NewCaseID
from vw_BranchCaseCurrent a
where
a.CaseID = @OldCaseID;
但问题是,如果vw_BranchCaseCurrent
已经存在新CaseID
和现有BranchID
那么此 SQL 将崩溃,因为它违反了支持表上的唯一约束。 所以我需要在执行update
时跳过该行。
我在想也许我可以使用merge
语句,但我并不完全熟悉它们的工作原理......
大约有十几个其他视图需要更新,所以如果可能的话,我正在寻找一些简单的东西......
编辑:让我用一个例子来澄清:
| CaseID | BranchID |
|--------|----------|
| 42 | 8008 |
| 42 | 9001 |
| 86 | 9001 |
所以我想通过更新此视图中的CaseID
字段将案例 42 合并到案例 86 中。 我想将第一个CaseID
从 42 更改为 86。但是第二行,我无法对此做任何事情,因为CaseID
86 的BranchID
已经存在CaseID
所以我CaseID
会那个。
这是一个简单的例子; 除了CaseID
之外,我需要合并的其他一些视图还有多个 ID 字段......
您可以使用not exists
、 not in
或left join
来表达这一点。 . . 甚至使用窗口函数。
with toupdate as (
select bcc.*, sum(case when CaseID = @NewCaseID then 1 else 0 end) over () as num_new
from vw_BranchCaseCurrent bcc
)
update toupdate
set CaseID = @NewCaseID
where CaseID = @OldCaseID and num_new = 0;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.