[英]SQL: IF NOT EXISTS INSERT then UPDATE
我知道有很多關於此主題的帖子,但這略有不同。 我有2個表variant_detail (vad)
和variant_external_analysis (vaea)
。 vaea
主要是空的,我需要為vad
所有行更新它。 如果我插入vaea
並且該行已經存在,它將復制該行,從而破壞數據庫。
在1行測試中,我解決了以下問題:
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語句,它才可以正常工作,這樣它將影響整個表。 下面的代碼可正確更新,但現在不再插入
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
我可能缺少一些簡單的東西。
該代碼看起來與T-SQL非常相似,因此這里是一個示例,說明如何在MS SQL Server中使用MERGE進行操作:
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要用單行測試子句:
using
子句中添加code
作為返回列 code
條件擴展when
子句 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)
;
您的where子句中有“ vad_variant_code = vad_id = vaea_vad_id”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.