Как решить эту специфическую для SQL проблему слияния - PullRequest
0 голосов
/ 08 апреля 2019

Как устранить ошибку:

Оператор MERGE пытался ОБНОВИТЬ или УДАЛИТЬ одну и ту же строку более одного раза.Это происходит, когда целевая строка соответствует более чем одной исходной строке.Оператор MERGE не может ОБНОВИТЬ / УДАЛИТЬ одну и ту же строку целевой таблицы несколько раз.Уточните предложение ON, чтобы обеспечить соответствие целевой строки максимум одной исходной строке, или используйте предложение GROUP BY для группировки исходных строк.

merge CARD_ALERTS as t
using @tblAlerts as s
on (t.Id = s.AlertId and t.CardId = s.CardId)
when not matched by target
    then insert(Id, ExternalCodeHolder, CardId, IsCardOwner, IBAN, PAN, MinAmount, Currency, ByEmail, BySMS, IssueDate, IsActive)
        values(s.AlertId, s.ExternalCodeHolder, s.CardId, s.IsCardOwner, s.IBAN, s.PAN, s.MinAmount, s.Currency, s.ByEmail, s.BySMS, getdate(), 1)
when matched 
    then update set t.ByEmail = s.ByEmail, t.BySMS = s.BySMS, IsActive = 1, t.MinAmount = s.MinAmount
when not matched by source and t.Id=@AlertId 
    then update set t.IsActive = 3

1 Ответ

1 голос
/ 08 апреля 2019

Как объяснено в сообщении об ошибке и в комментариях, несколько строк исходной таблицы соответствуют одной и той же строке в целевой.

Это покажет вам, какие строки целевой таблицы имеют несколько строк из исходной таблицы, которые пытаются обновить их:

select t.Id,t.CardId,count(*) as [count]
from CARD_ALERTS as t
inner join @tblAlerts as s
on (t.Id = s.AlertId and t.CardId = s.CardId)
group by t.Id,t.CardId
having count(*)>1

Это также покажет вам несколько строк исходной таблицы:

select t.*,s.*
from CARD_ALERTS as t
inner join @tblAlerts as s on (t.Id = s.AlertId and t.CardId = s.CardId)
inner join
(
    select ca.Id,ca.CardId
    from CARD_ALERTS as ca
    inner join @tblAlerts as s
    on (ca.Id = s.AlertId and ca.CardId = s.CardId)
    group by ca.Id,ca.CardId
    having count(*)>1
)tkey on t.Id=tkey.Id and t.CardId=tkey.CardId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...