繁体   English   中英

如果 SQL Server 中不存在则更新?

[英]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 existsnot inleft 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM