【问题标题】:UPDATE with SUM() in MySQL在 MySQL 中使用 SUM() 进行更新
【发布时间】:2009-03-17 11:26:08
【问题描述】:

我的桌子:

ID 名称 COST PAR P_val S_val 1×5 0 1 0 1 年 5 0 2 0 1 z 5 0 0 5 2 XY 4 0 4 4

我需要用SUM(S_val) 更新PAR 字段,按ID 分组:

  • 对于 ID 1 PAR 应该是 SUM(SVAL) WHERE ID=1
  • 对于 ID 2 PAR 应该是 SUM(SVAL) WHERE ID=2

预期输出:

ID 名称 COST PAR P_val S_val 1×5 5 1 0 1 年 5 5 2 0 1 z 5 5 0 5 2 XY 4 4 4 4

我怎样才能UPDATEPAR 值?

我的代码:

UPDATE Table_Name SET PAR = (SELECT SUM(S_val) FROM Table_Name WHERE ID=1) 
FROM   Table_Name

这不起作用。

【问题讨论】:

  • 虽然已经回答了这个问题,但您要求的是一种低效的做事方式,存在大量数据重复。由于您是按 ID 聚合数据,因此如果您创建第二个以 ID 作为其主键的表,然后将总和存储在该表中,则数据重复会减少。然后,您可以在必要时在连接中检索总和。由于每当更新原始表中的任何条目时您都必须重新计算数据,因此您将只更新每个 ID 的 1 个条目,而不是很多。这种方法也不易出错。

标签: sql mysql


【解决方案1】:

很遗憾,您无法更新在MySQL 中与自身连接的表。

您需要创建一个函数作为解决方法:

DELIMITER $$

CREATE FUNCTION `fn_get_sum`(_id INT) RETURNS int(11)
READS SQL DATA
BEGIN
      DECLARE r INT;
      SELECT  SUM(s_val)
      INTO    r
      FROM    table_name
      WHERE   id = _id;
      RETURN r;
END $$

DELIMITER ;

UPDATE  table_name
SET     par = fn_get_sum(id)

【讨论】:

【解决方案2】:

试试:

UPDATE Table_NAme SET PAR= summedValue
FROM   TAble_NAME t
JOIN (
  SELECT ID, SUM(S_val) as summedvalue 
  FROM TABLE_NAME GROUP BY ID
  ) s on t.ID = s.ID

【讨论】:

    【解决方案3】:
    UPDATE Table_Name SET PAR = (SELECT SUM(S_val) FROM Table_Name WHERE ID=1) 
    FROM   Table_Name
    

    检查写作。删除“FROM Table_Name”行。

    TRUE 命令是:

    UPDATE Table_Name SET PAR = (SELECT SUM(S_val) FROM Table_Name WHERE ID=1)
    

    【讨论】:

    • 这只是因为 select 表达式中的 1 是一个常量,并且与外部更新中的 id 值不协调。此限制使您无法一次更新表中的所有行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多