我已尝试以下 MySQL 更新,但它仅设置第一个字段 c.avg_price_dil
而不是第二个字段 c.avg_dilution
。
奇怪的是,当我将更新分为两部分(如下所示)时,两个部分都适用于正在更新的两个字段。基于组的函数是否会影响此调用?
更新了两个字段 - 仅更新了 c.avg_price_dil
。
update corp_act as c
inner join (
select
m.gvkey, m.gvkey_iid, m.date_base, avg(m.price_dil) as avg_price,
avg(m.dilution) as avg_dilution
from master as m
inner join corp_act as c
on c.gvkey = m.gvkey AND
m.date_base between c.date_base AND
LAST_DAY(c.date_base + INTERVAL 11 MONTH)
where c.actioncd not in ('N/C','REA','SPN') AND
c.actioncd IS NOT NULL
group by m.gvkey_iid, c.actioncd) as x
on
x.gvkey = c.gvkey AND
x.date_base = c.date_base
set
c.avg_price_dil = if(x.avg_price is null, 0, x.avg_price) AND
c.avg_dilution = if(x.avg_dilution is null, 0, x.avg_dilution)
当分成两个更新时,两者都有效:
稀释更新: - 工作正常
update corp_act as c
inner join (
select
m.gvkey, m.gvkey_iid, m.date_base, avg(m.dilution) as avg_dilution
from master as m
inner join corp_act as c
on c.gvkey = m.gvkey AND
m.date_base between c.date_base AND
LAST_DAY(c.date_base + INTERVAL 11 MONTH)
where c.actioncd not in ('N/C','REA','SPN') AND
c.actioncd IS NOT NULL
group by m.gvkey_iid, c.actioncd) as x
on
x.gvkey = c.gvkey AND
x.date_base = c.date_base
set
c.avg_dilution = if(x.avg_dilution is null, 0, x.avg_dilution)
价格更新: - 效果很好
update corp_act as c
inner join (
select
m.gvkey, m.gvkey_iid, m.date_base, avg(m.price_dil) as avg_price
from master as m
inner join corp_act as c
on c.gvkey = m.gvkey AND
m.date_base between c.date_base AND
LAST_DAY(c.date_base + INTERVAL 11 MONTH)
where c.actioncd not in ('N/C','REA','SPN') AND
c.actioncd IS NOT NULL
group by m.gvkey_iid, c.actioncd) as x
on
x.gvkey = c.gvkey AND
x.date_base = c.date_base
set
c.avg_price_dil = if(x.avg_price is null, 0, x.avg_price)
这两者之间的唯一区别是我只在各个函数中使用 avg
函数一次。
有什么想法吗? 感谢您的帮助。
最佳答案
设置
c.avg_price_dil = if(x.avg_price 为 null, 0, x.avg_price) AND
c.avg_dilution = if(x.avg_dilution 为 null, 0, x.avg_dilution)
尝试用逗号 (,
) 替换 AND
。
关于mysql - 为什么MySQL更新只更新1个字段而不更新2个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11240231/