我有一个带有权重的表,我想在mysql中重新规范化它。当我尝试将表连接到依赖于自身的内联查询时,会出现“cannotreopentable”错误,当我尝试使用cte时,也会出现同样的错误。下表示例:
重量
monthEnd, portName, ticker, wgt
2019-04-30, test, MTUM, 0.20451060987312306
2019-04-30, test, SIZE, 0.20763723114425484
2019-04-30, test, USMV, 0.2043537465059284
2019-04-30, test, QUAL, 0.20758892877605561
2019-04-30, test, VLUE, 0.20683696239330326
我想做如下的事情来重新规范化 wgt
列(即,总和(wgt)=1):
select a.monthEnd, ticker, wgt/totWgt
from weights a
inner join (
select monthEnd, sum(wgt) as totWgt
from weights
group by monthEnd ) tot
on a.monthEnd = tot.monthEnd
但我收到一条错误信息,表明:
Error Code: 1137. Can't reopen table: 'a'
当我尝试使用cte而不是临时表来执行此操作时,会收到相同的消息,这似乎是mysql中的一个已知问题。
只要我需要weights表来计算总权重,我尝试做的唯一可能的方法就是创建另一个临时表来保存总权重,并将我的weights表连接到它来进行规范化。
在mysql 8.0中有没有更好的方法来实现这一点。
1条答案
按热度按时间qnzebej01#
mysql只允许对临时表有一个引用。你可以把table复制过来。但是,窗口函数是一种更简单的解决方案: