首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:如果不存在插入,则更新

SQL:如果不存在插入,则更新
EN

Stack Overflow用户
提问于 2018-11-04 10:59:06
回答 2查看 110关注 0票数 0

我知道有很多关于这个主题的帖子,但这有点不同。我有两个桌子variant_detail (vad)variant_external_analysis (vaea)vaea主要是空的,我需要为vad中的所有行更新它。如果我在vaea中插入,并且该行已经存在,则它会复制该行,从而破坏数据库。

在1行测试中,我解决了以下问题:

代码语言:javascript
复制
IF NOT EXISTS (SELECT vaea_vad_id FROM variant_external_analysis 
            JOIN variant_detail ON vad_id = vaea_vad_id 
            WHERE vad_variant_code = 16469)
BEGIN
    INSERT variant_external_analysis (vaea_vad_id) 
    SELECT vad_id
    FROM variant_detail
END

UPDATE variant_external_analysis

SET vaea_last_amended_on = GETDATE(), vaea_last_amended_by = 13, vaea_n_1 = 1

FROM variant_external_analysis
JOIN variant_detail ON vad_id = vaea_vad_id

WHERE vad_variant_code = 16469

在我移除WHERE语句以使其影响整个表之前,这是非常有效的。下面的代码正确地更新,但现在不再插入

代码语言:javascript
复制
IF NOT EXISTS (SELECT vaea_vad_id FROM variant_external_analysis

JOIN variant_detail ON vad_id = vaea_vad_id 

            WHERE vad_id = vaea_vad_id)
BEGIN
    INSERT variant_external_analysis (vaea_vad_id) 
    SELECT vad_id
    FROM variant_detail
END

UPDATE variant_external_analysis

SET vaea_last_amended_on = GETDATE(), vaea_last_amended_by = 13, vaea_n_1 = 1

FROM variant_external_analysis
JOIN variant_detail ON vad_id = vaea_vad_id

我可能错过了一些简单的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-04 11:34:42

代码看起来非常类似于The,下面是一个如何在MS中使用合并实现它的示例:

代码语言:javascript
复制
merge variant_external_analysis vea
--using here left join (along with where condition) we'll get only rows 
--that are in variand_details but aren't in variant_external_analysis
using(select vd.vad_id 
  from variant_detail vd
  left join variant_external_analysis vaea on vd.vad_id = vaea.vaea_vad_id 
  where vaea.id is null) t --or any another column of vaea
on (vea.vaea_vad_id = t.vad_id)
when not matched then 
    insert (vaea_vad_id, vaea_last_amended_on, vaea_last_amended_by, vaea_n_1)
    values(t.vad_id, getdate(), 13, 1)
;

使用单行测试子句的UPD

  1. code子句中添加using作为返回列
  2. 使用when条件扩展code子句
代码语言:javascript
复制
merge variant_external_analysis vea
    --using here left join (along with where condition) we'll get only rows 
    --that are in variand_details but aren't in variant_external_analysis
    using(select vd.vad_id, vd.vad_variant_code 
      from variant_detail vd
      left join variant_external_analysis vaea on vd.vad_id = vaea.vaea_vad_id 
      where vaea.id is null) t --or any another column of vaea
    on (vea.vaea_vad_id = t.vad_id)
    when not matched and t.vad_variant_code = 16469 then 
        insert (vaea_vad_id, vaea_last_amended_on, vaea_last_amended_by, vaea_n_1)
        values(t.vad_id, getdate(), 13, 1)
    ;
票数 2
EN

Stack Overflow用户

发布于 2018-11-04 11:30:44

在where子句中有"vad_variant_code = vad_id = vaea_vad_id“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53140078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档