这是我的合并语句:
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}}语句,我得到了重复的匹配项。但是...我不在乎。如果源表中的记录已存在于目标表中,则我什么也不想做。完全不更新任何内容。跳过它。
有可能吗?
答案 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语句来忽略此错误。但是我通过生成一个标识列(不是永久性的)解决了这个问题,该列使我可以为句子的source
和target
的每条记录添加一个唯一值,并比较表格。像这样:
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