1

我有一个带有 JOIN 的 UPDATE 查询,它抛出以下错误:

MERGE 语句多次尝试更新或删除同一行。当目标行匹配多个源行时会发生这种情况。MERGE 语句不能多次 UPDATE/DELETE 目标表的同一行。优化 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。

编辑:

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

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

结束编辑

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

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

任何帮助表示赞赏。

编辑2:

这是测试数据。我不能给你一个重现,因为正如我所说,我找不到哪些数据给我带来了问题。

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

更新!

我找到了罪魁祸首。当我从 priceupdates 表中排除特定记录时,它可以工作!但我仍然不知道那张唱片有什么问题。我从这里去哪里?注意:当我包含该记录时,更新也有效。

4

1 回答 1

3

我的评论原来是一个答案:

我在您的代码中没有看到任何MERGE声明。MERGE使用时错误是否真的调用它UPDATE?难以置信。另外,UPDATEs根本没有那个消息。该消息清楚地提到了一个MERGE和一个ON子句。

UPDATE不是问题。看看别处。

于 2013-04-12T17:21:06.943 回答