【发布时间】:2019-03-06 18:30:08
【问题描述】:
这是我的合并声明:
MERGE PE_TranslationPhrase T
USING PE_TranslationPhrase_Staging S
ON (T.CultureName = S.CultureName AND T.Phrase = S.Phrase)
WHEN MATCHED
THEN UPDATE SET T.TranslationId = T.TranslationId -- do nothing
WHEN NOT MATCHED BY TARGET
THEN INSERT (TranslationId, CultureName, Phrase)
VALUES (S.TranslationId, S.CultureName, S.Phrase);
WHEN MATCHED 部分似乎有问题。基于on this question and answer,我将WHEN MATCHED改为:
THEN UPDATE SET T.TranslationId = T.TranslationId
但我仍然收到此错误:
MERGE 语句多次尝试更新或删除同一行。当目标行匹配多个源行时会发生这种情况。 MERGE 语句不能多次 UPDATE/DELETE 目标表的同一行。优化 ON 子句以确保目标行最多匹配一个源行,或使用 GROUP BY 子句对源行进行分组。
我知道原因了。根据ON 声明,我得到了重复的匹配项。但是……我不在乎。如果源表中的记录已经存在于目标表中,那么我什么都不做。根本不更新任何东西。跳过它。
这可能吗?
【问题讨论】:
-
为什么不直接省略
WHEN MATCHED部分? -
值得一提的是,您不能在 NULL 上进行匹配,因此您最好在两个匹配列周围使用 ISNULL(如果它们还不是 NOT NULL)
标签: sql sql-server tsql merge sql-server-2017