SQL MERGE:是否可以忽略MATCH?

时间:2019-03-06 18:30:08

标签: sql sql-server tsql merge sql-server-2017

这是我的合并语句:

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语句不能多次更新/删除目标表的同一行。优化ON子句以确保目标行最多匹配一个源行,或使用GROUP BY子句对源行进行分组。

我知道为什么。根据{{​​1}}语句,我得到了重复的匹配项。但是...我不在乎。如果源表中的记录已存在于目标表中,则我什么也不想做。完全不更新任何内容。跳过它。

有可能吗?

4 个答案:

答案 0 :(得分:2)

哦。事实证明,您不需要'WHEN MATCHED'语句。我认为这是必需的。

MERGE PE_TranslationPhrase T
USING PE_TranslationPhrase_Staging S 
ON (T.CultureName = S.CultureName AND T.Phrase = S.Phrase)
WHEN NOT MATCHED BY TARGET
        THEN INSERT (TranslationId, CultureName, Phrase)
        VALUES (S.TranslationId, S.CultureName, S.Phrase);

答案 1 :(得分:1)

如果未完成更新,是否考虑过使用migrations.RunSQL( "CREATE SEQUENCE sequence_name START 100000", reverse_sql="DROP SEQUENCE IF EXISTS sequence_name", elidable=False, ), 中不在def get_next_increment(): with connection.cursor() as cursor: cursor.execute("SELECT nextval('sequence_name')") result = cursor.fetchone() return result[0] class MyModel(models.Model): my_field = models.IntegerField(default=get_next_increment, editable=False, unique=True) 中的行进行插入?

CTE方法:

PE_TranslationPhrase_Staging

子查询方法:

PE_TranslationPhrase

答案 2 :(得分:0)

不幸的是,无法通过MERGE语句来忽略此错误。但是我通过生成一个标识列(不是永久性的)解决了这个问题,该列使我可以为句子的sourcetarget的每条记录添加一个唯一值,并比较表格。像这样:

ROW_NUMBER () OVER (PARTITION BY CultureName, Phrase ORDER BY CultureName, Phrase)

答案 3 :(得分:0)

否,在存在多个匹配项的情况下,您不能使用Merge ... When Matched ...,而您可以发现,只需删除When Matched部分。但是,如果您需要update的本节内容,而不是使用Merge,则可以使用以下代码:

update PE_TranslationPhrase
set  TranslationId = S.xxx
from
PE_TranslationPhrase T, PE_TranslationPhrase_Staging S
where T.CultureName = S.CultureName AND T.Phrase = S.Phrase