【问题标题】:SQL Update to the SUM of its joined valuesSQL 更新其连接值的总和
【发布时间】:2011-01-30 21:59:31
【问题描述】:

我正在尝试将数据库中的一个字段更新为其连接值的总和:

UPDATE P
SET extrasPrice = SUM(E.price)
FROM dbo.BookingPitchExtras AS E
INNER JOIN dbo.BookingPitches AS P ON E.pitchID = P.ID
    AND P.bookingID = 1
WHERE E.[required] = 1

当我运行它时,我收到以下错误:

"An aggregate may not appear in the set list of an UPDATE statement."

有什么想法吗?

【问题讨论】:

  • 你想做什么?您是否尝试使用所有相应 dbo.BookingPitcheExtras 记录 price 列的总和来更新 一些 dbo.BookingPitches 记录?
  • 如果要使用SUM,则需要指定要分组的字段。
  • 这个说法没有任何意义。你到底想做什么?

标签: sql sum sql-update


【解决方案1】:

这个怎么样:

UPDATE p
SET p.extrasPrice = t.sumPrice
FROM BookingPitches AS p
INNER JOIN
    (
        SELECT PitchID, SUM(Price) sumPrice
        FROM BookingPitchExtras
        WHERE [required] = 1
        GROUP BY PitchID 
    ) t
    ON t.PitchID = p.ID
WHERE p.bookingID = 1

【讨论】:

  • 我今天使用这个语法作为我的更新语句的指南,就像一个魅力。作为旁注,请确保完全按照您在此处看到的那样使用别名值。起初我没有,我花了一点时间试图找出我的问题。
【解决方案2】:

使用 postgres,我必须调整解决方案才能为我工作:

UPDATE BookingPitches AS p
SET extrasPrice = t.sumPrice
FROM 
    (
        SELECT PitchID, SUM(Price) sumPrice
        FROM BookingPitchExtras
        WHERE [required] = 1
        GROUP BY PitchID 
    ) t
WHERE t.PitchID = p.ID AND p.bookingID = 1

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,发现我可以用Common Table Expression 解决它(在 SQL 2005 或更高版本中可用):

    ;with cte as (
        SELECT PitchID, SUM(Price) somePrice
        FROM BookingPitchExtras
        WHERE [required] = 1 
        GROUP BY PitchID)
    UPDATE p SET p.extrasPrice=cte.SomePrice
    FROM BookingPitches p INNER JOIN cte ON p.ID=cte.PitchID
    WHERE p.BookingID=1
    

    【讨论】:

      【解决方案4】:

      上述解决方案的替代方案是使用表别名:

      UPDATE T1 SET T1.extrasPrice = (SELECT SUM(T2.Price) FROM BookingPitchExtras T2 WHERE T2.pitchID = T1.ID)
      FROM BookingPitches T1;
      

      【讨论】:

      • 我必须更改变量,例如UPDATE BookingPitches SET extrasPrice =
      【解决方案5】:

      这是一个有效的错误。见this。以下(以及以下建议的其他内容)是实现此目的的方法:-

      UPDATE P 
      SET extrasPrice = t.TotalPrice
      FROM BookingPitches AS P INNER JOIN
       (
        SELECT
          PitchID,
          SUM(Price) TotalPrice
        FROM
           BookingPitchExtras
        GROUP BY PitchID
        ) t
      ON t.PitchID = p.ID
      

      【讨论】:

      • @Ashish Gupta - 看起来很像我的查询...嗯
      • 哎呀...对不起..要我删除答案吗?我在编写查询并阅读那篇文章时没有加载答案。
      • 不,这很好,我只是觉得奇怪的是我们甚至使用了相同的临时存储 t,而且查询几乎完全相同。 2 个答案比 1 个更好。
      • JonH,我会在写答案的同时学习加载答案。再次抱歉。不是那个意思。我也编辑了我的答案。
      【解决方案6】:

      你需要这样的东西:

      UPDATE P
      SET ExtrasPrice = E.TotalPrice
      FROM dbo.BookingPitches AS P
      INNER JOIN (SELECT BPE.PitchID, Sum(BPE.Price) AS TotalPrice
          FROM BookingPitchExtras AS BPE
          WHERE BPE.[Required] = 1
          GROUP BY BPE.PitchID) AS E ON P.ID = E.PitchID
      WHERE P.BookingID = 1
      

      【讨论】:

        【解决方案7】:

        使用类似于下面的子查询。

        UPDATE P
        SET extrasPrice = sub.TotalPrice from
        BookingPitches p
        inner join 
        (Select PitchID, Sum(Price) TotalPrice
            from  dbo.BookingPitchExtras
            Where [Required] = 1
            Group by Pitchid
        ) as Sub
        on p.Id = e.PitchId 
        where p.BookingId = 1
        

        【讨论】:

          猜你喜欢
          • 2019-07-03
          • 2018-05-09
          • 2018-12-19
          • 1970-01-01
          • 2021-03-31
          • 2017-09-03
          • 1970-01-01
          • 1970-01-01
          • 2011-05-05
          相关资源
          最近更新 更多