SQL: ЕСЛИ НЕ СУЩЕСТВУЕТ ВСТАВИТЬ, А ОБНОВИТЬ - PullRequest
0 голосов
/ 04 ноября 2018

Я знаю, что есть много сообщений на эту тему, но это немного отличается. У меня есть 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

Возможно, мне не хватает чего-то простого.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Код выглядит очень похоже на T-SQL, поэтому вот пример, как это сделать, используя MERGE в MS SQL Server:

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

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)
    ;
0 голосов
/ 04 ноября 2018

У вас есть пункт "vad_variant_code = vad_id = vaea_vad_id" в предложении where.

...