使用join抛出更新“MERGE语句尝试多次更新或删除同一行。”

时间:2013-04-12 15:16:35

标签: sql sql-server sql-merge

我有一个带有JOIN的UPDATE查询,引发了以下错误:

MERGE语句尝试多次更新或删除同一行。当目标行与多个源行匹配时会发生这种情况。 MERGE语句不能多次更新/删除目标表的同一行。优化ON子句以确保目标行最多匹配一个源行,或使用GROUP BY子句对源行进行分组。

这是我的更新声明:

UPDATE
    Products
SET
    price = pu.ColumnValue
FROM
    Products p
    JOIN #priceupdates pu ON p.sku = pu.sku AND p.idManufacturer = pu.idManufacturer

产品由SKU和idManufacturer加入#priceupdates。

我的#priceupdates表中没有重复项或NULL。

修改

为了证明这一点,我运行了以下两个语句,它们都返回了相同数量的记录:

select sku, idmanufacturer from #priceupdates
select distinct sku, idmanufacturer from #priceupdates

结束编辑

根据#priceupdates中的数据,它会抛出或不抛出错误,但我很难找到哪个数据是问题的根源。

那么,除了有重复之外,还有哪些其他因素会导致这个错误?

感谢任何帮助。

编辑2:

这是测试数据。我不能给你一个repro因为我说我找不到哪个数据给我这个问题。

CREATE TABLE #Products (idProduct INT, SKU VARCHAR(50), idManufacturer INT, Price FLOAT)
INSERT INTO #Products
SELECT '316992', '00015', '123', '0.52'
UNION SELECT '316993', '00037', '123', '0.52'
UNION SELECT '316994', '00039', '123', '0.52'
UNION SELECT '316995', '00115', '123', '0.52'
UNION SELECT '316996', '00137', '123', '0.52' 

CREATE TABLE #PriceUpdates (ProductUpdateID INT, SKU VARCHAR(50), idManufacturer INT, ColumnName VARCHAR(50), ColumnValue VARCHAR(50), idUser INT, BatchID INT)
INSERT INTO #PriceUpdates
SELECT '1837', '00015', '123', 'Price', '0.99', '13', '1929'
UNION SELECT '1838', '00037', '123', 'Price', '0.99', '13', '1929'
UNION SELECT '1839', '00039', '123', 'Price', '0.99', '13', '1929'
UNION SELECT '1840', '00115', '123', 'Price', '0.99', '13', '1929'
UNION SELECT '1841', '00137', '123', 'Price', '0.99', '13', '1929' 

UPDATE
    p
SET
    price = pu.ColumnValue 
FROM
    #Products p
    JOIN #priceupdates pu ON p.sku = pu.sku AND p.idManufacturer = pu.idManufacturer

 DROP TABLE #Products
 DROP TABLE #PriceUpdates

更新<!/ B>

认为我找到了罪魁祸首。当我从priceupdates表中排除特定记录时,它可以正常工作!但我仍然不知道该记录有什么问题。我从哪里开始?注意:当我包含该记录时,更新也会起作用。

1 个答案:

答案 0 :(得分:3)

我的评论结果是一个答案:

我的代码中没有看到MERGE语句。使用MERGE时,错误是否真的称之为UPDATE?难以置信。此外,UPDATEs根本没有该消息。该消息明确指出MERGEON条款。

UPDATE不是问题。看别处。