首页 > 解决方案 > MySQL 使用基于另一个表值的条件进行更新

问题描述

我在 MySQL 中有两个表。我想将“总计”列的值设置为等于比率 x(如果项目以 A 开头,则表 A 列)或比率 x(如果项目以 B 开头,则表 B 列)和月份列两个表匹配。

create table zeus(id int primary key,
                  Month varchar(10),
                  Items varchar(20),
                  Ratio decimal(3,2),
                  Total decimal(10,2));


create table ares(id int primary key,
                  Month varchar(10),
                  `Value A` decimal(10,2),
                  `Value B` decimal(10,2));
ID 项目 比率 全部的
1 可能 0.50
2 可能 苹果 0.3
3 可能 瓶子 0.25
4 可能 橡子 0.1
5 可能 闹钟 0.6
6 可能 瓶子 0.25
ID 总甲 总乙
1 可能 600 800
2 六月 780 400

我试过这个

update zeus
set Total = (CASE 
                      WHEN Items like ('A%') and Month = 'May'
                        THEN Ratio * (select(ares.`Value A`)
                        WHERE Month = 'May')
                      WHEN Items like ('B%') and Month = 'May'
                        THEN Ratio * (select(ares.`Value B`)
                        WHERE Month = 'May')
                        END);

但我似乎无法弄清楚。

标签: mysql

解决方案


看起来你只是想要:

update zeus
inner join ares using (Year,Month)
set zeus.Total = case
    when zeus.Items like 'A%' then ares.`Value A` * zeus.Ratio
    when zeus.Items like 'B%' then ares.`Value B` * zeus.Ratio
end

如果 Items 既不以 A 也不以 B 开头,这会将 Total 设置为 null;如果您希望它设置为空白或保留为现有的 zeus.Total 值,请添加一个 else 子句。

请注意,具有相关值的列名数组而不是每行一个值的单独表通常被认为是糟糕的数据库设计。


推荐阅读