我有一个这样的合并语句:
MERGE INTO TEMSPASA
USING (SELECT *
FROM OPENQUERY(orad, 'SELECT * FROM CDAS.TDWHCORG')) AS TDWHPASA ON TEMSPASA.pasa_cd = LTRIM(RTRIM(TDWHPASA.corg_id)) AND
TEMSPASA.pasa_active_ind = TDWHPASA.corg_active_ind
WHEN MATCHED THEN
UPDATE
SET
TEMSPASA.pasa_desc = LTRIM(RTRIM(TDWHPASA.corg_nm)),
TEMSPASA.pasa_active_ind = TDWHPASA.corg_active_ind
WHEN NOT MATCHED THEN
INSERT (pasa_cd, pasa_desc, pasa_active_ind)
VALUES (LTRIM(RTRIM(TDWHPASA.corg_id)), TDWHPASA.corg_nm, TDWHPASA.corg_active_ind);
有些pasa_cd类似于('H04','H04 *'),其中*不是通配符。但是我认为on语句会将其视为通配符,因为当我尝试运行merge语句时,出现以下错误:
MERGE语句尝试多次更新或删除同一行。当目标行与多个源行匹配时,就会发生这种情况。 MERGE语句不能多次更新/删除目标表的同一行。优化ON子句以确保目标行最多匹配一个源行,或使用GROUP BY子句对源行进行分组。
我已验证我的表中没有重复项。我唯一能想到的就是我上面提到的内容,即merge语句的ON部分将*视为通配符。
我尝试搜索,看到了有关转义字符的内容,但这在where子句中。有什么想法如何处理吗?
答案 0 :(得分:1)
这意味着您在源表和目标表之间有不止1行匹配。您需要在这里找出问题所在的行。可能来自任何一个表。这样的事情应该可以帮助您确定问题的根源。
SELECT LTRIM(RTRIM(TDWHPASA.corg_id))
, TDWHPASA.corg_active_ind
FROM CDAS.TDWHCORG as TDWHPASA
group by LTRIM(RTRIM(TDWHPASA.corg_id))
, TDWHPASA.corg_active_ind
having count(*) > 1
select t.pasa_cd
, t.pasa_active_ind
from TEMSPASA t
group by t.pasa_cd
, t.pasa_active_ind
having count(*) > 1
答案 1 :(得分:1)
所以我在最初的帖子中的理论是错误的。我的源表中有重复项,但这是基于区分大小写的。有值H04F和H04f。两者都是不同的行,但是由于我的sql中不区分大小写,因此将它们视为重复项。为了解决该问题,我在ON子句的末尾添加了COLLATE Latin1_General_CS_AS,它可以解决问题