Sql 使用“连接抛出”更新;MERGE语句多次尝试更新或删除同一行;

Sql 使用“连接抛出”更新;MERGE语句多次尝试更新或删除同一行;,sql,sql-server,sql-merge,Sql,Sql Server,Sql Merge,我有一个包含联接的更新查询,该联接引发以下错误: MERGE语句多次尝试更新或删除同一行。当目标行与多个源行匹配时,会发生这种情况。MERGE语句不能多次更新/删除目标表的同一行。优化ON子句以确保目标行最多匹配一个源行,或使用GROUP BY子句对源行进行分组 以下是我的更新声明: UPDATE Products SET price = pu.ColumnValue FROM Products p JOIN #priceupdates pu ON p.sku =

我有一个包含联接的更新查询,该联接引发以下错误:

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和IDM制造商的#价格更新

my#priceupdates表中没有重复项或空值

编辑:

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

select sku, idmanufacturer from #priceupdates
select distinct sku, idmanufacturer from #priceupdates
结束编辑

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

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
那么,除了有重复项之外,还有什么其他因素会导致这种错误呢

感谢您的帮助

编辑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表中排除特定记录时,它会工作!但我还是不知道那张唱片有什么问题。我该怎么办?注意:当我只包含该记录时,更新也会起作用。

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

我在代码中没有看到
MERGE
语句。使用
更新
时,错误是否真的将其称为
合并
?难以置信。而且,
更新
根本没有该消息。该消息清楚地引用了
合并
ON
子句


更新
不是问题所在。看看其他地方。

简短的回答是,尽管价格更新在所有列中都可能是唯一的,但对于sku和制造商来说,它不可能是唯一的。对于同一sku/制造商组合,您在#priceupdates中有多条记录。请尝试聚合sku/制造商上的#priceupdates的总数,并获取columnvalue的max/min/avg/etc。@Love2Learn请参见我的编辑-#priceupdates对于sku和IDManufacturer是唯一的。当您运行这些查询时,它失败了吗?你说它是间歇性的,只是其中一次没有失败。你能提供
#priceupdates
的声明定义吗?我在你的代码中没有看到MERGE语句。当使用更新时,错误是否真的调用它MERGE?难以置信。而且,更新根本没有这个消息。这条消息清楚地提到了MERGE和ON子句。谢谢@usr。感谢洛夫托勒恩和阿伦伯特朗对我的支持。