【问题标题】:Getting SQL Server Merge Error获取 SQL Server 合并错误
【发布时间】:2018-01-27 21:51:24
【问题描述】:

我正在尝试使用合并功能更新产品历史的平均评分数

 MERGE ProductRankingHistory P
 USING Review R ON P.PRHProduct = R.ProductID

 WHEN MATCHED THEN
     UPDATE 
         SET P.PRHAverageRating = (SELECT AVG(ReviewRateValue) 
                                   FROM Review 
                                   WHERE ProductID = P.PRHProduct 
                                     AND YEAR(ReviewRateDate) = PRHYear);

我得到这个错误:

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

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 复制this?

标签: sql sql-server merge


【解决方案1】:

Merge 对于这个逻辑似乎是不必要的。比如:

UPDATE ProductRankingHistory P
    SET PRHAverageRating = (SELECT AVG(r.ReviewRateValue)
                            FROM Review r
                            WHERE r.ProductID = P.PRHProduct AND YEAR(r.ReviewRateDate) = P.PRHYear
                           )
    WHERE EXISTS (SELECT 1
                  FROM Review r
                  WHERE r.ProductID = P.PRHProduct AND YEAR(r.ReviewRateDate) = P.PRHYear
                 );

写完这篇文章后,我发现您可能正在使用 SQL Server(或类似的数据库)。以下方法可能有效:

UPDATE p
    SET PRHAverageRating = rp.avg_ReviewRateValue
    FROM ProductRankingHistory p JOIN
         (SELECT r.ProductID, YEAR(r.ReviewRateDate) as yyyy, AVG(r.ReviewRateValue) as avg_ReviewRateValue
          FROM Review r
          GROUP BY r.ProductID, YEAR(r.ReviewRateDate)
         ) rp
         ON rp.ProductId = p.PRHProduct AND rp.yyyy = p.prhYear;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2018-11-22
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多