【问题标题】:Update with join throws "The MERGE statement attempted to UPDATE or DELETE the same row more than once." [closed]使用连接更新会抛出“MERGE 语句多次尝试更新或删除同一行。” [关闭]
【发布时间】:2013-04-12 15:16:34
【问题描述】:

我有一个带有 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 表中没有重复项或空值。

编辑:

为了证明这一点,我运行了以下 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 表中排除特定记录时,它可以工作!但我仍然不知道那张唱片有什么问题。我从这里去哪里?注意:当我包含该记录时,更新也会起作用。

【问题讨论】:

  • 简短的回答是,虽然#priceupdates 可能在所有列中都是唯一的,但它不能对 sku 和制造商唯一。对于同一个 sku/制造商组合,您在 #priceupdates 中有多个记录。
  • 尝试在 sku/manufacturer 上聚合 #priceupdates 的数量,并获取列值的 max/min/avg/etc。
  • @Love2Learn 查看我的编辑 - #priceupdates 在 sku 和 idmanufacturer 中是独一无二的
  • 当您运行这些查询时,它是否失败了?你说它是间歇性的,那只是它没有失败的一次。能否提供#priceupdates的声明定义?
  • 我在您的代码中没有看到 MERGE 语句。使用 UPDATE 时错误是否真的将其称为 MERGE?难以置信。此外,更新根本没有该消息。该消息清楚地提到了一个 MERGE 和一个 ON 子句。

标签: sql sql-server sql-merge


【解决方案1】:

我的评论竟然是一个答案:

我在您的代码中没有看到 MERGE 语句。使用UPDATE 时,错误是否真的将其称为MERGE?难以置信。此外,UPDATEs 根本没有该消息。该消息明确提到了MERGEON 子句。

UPDATE 不是问题所在。看看别处。

【讨论】:

  • 谢谢@usr。感谢 LoveToLearn 和 AaronBertrand 对我的包容。
猜你喜欢
  • 1970-01-01
  • 2017-03-06
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多