我有一个带有 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 表中排除特定记录时,它可以工作!但我仍然不知道那张唱片有什么问题。我从这里去哪里?注意:当我只包含该记录时,更新也有效。