在mysql中添加具有相关子查询的自动生成列
我想添加一个根据其他表自动生成值的列。有两个表可供使用 表1财务:在mysql中添加具有相关子查询的自动生成列,mysql,sql,Mysql,Sql,我想添加一个根据其他表自动生成值的列。有两个表可供使用 表1财务: revenue | d 1 |2020-07-01 2 |2020-10-02 3 |2020-01-09 表格价格: price | d 1 | 2020-10-01 2 | 2020-10-02 3 | 2020-10-03 4 | 2020-01-08 5 | 2020-10-09 通过执行这个命令 select p.*, (select f
revenue | d
1 |2020-07-01
2 |2020-10-02
3 |2020-01-09
表格价格:
price | d
1 | 2020-10-01
2 | 2020-10-02
3 | 2020-10-03
4 | 2020-01-08
5 | 2020-10-09
通过执行这个命令
select p.*,
(select f.revenue * 10 from finance f where f.d <= p.d order by d desc limit 1) revenue_X_10
from price p
我想通过做这样的事情来自动产生收入
ALTER TABLE price
ADD COLUMN revx10 FLOAT
GENERATED ALWAYS AS (select 10*f.revenue from finance f where p.d > f.d order by d desc limit 1) from price p;
但看起来我只能从同一个表中放入列,然后计算新列。我如何将revenue_x_10作为价格表上自动生成的列
我之所以想这样做是因为性能问题。我正在处理相对较大的数据集,比如价格上的几千行和财务上的十几行。有时我需要为几千张桌子做这个。使用查询太慢了。你不能。生成的列只能引用同一行中的值、常量和非易失性函数 您可以使用以下视图:
create view v_price as
select p.*,
(select f.revenue * 10
from finance f
where f.d <= p.d
order by d desc limit 1
) as revenue_X_10
from price p;
或者可能是一个insert触发器,以便在插入新行时计算值。您不能。生成的列只能引用同一行中的值、常量和非易失性函数 您可以使用以下视图:
create view v_price as
select p.*,
(select f.revenue * 10
from finance f
where f.d <= p.d
order by d desc limit 1
) as revenue_X_10
from price p;
或者可能是一个insert触发器,因此每当插入新行时都会计算该值。正如gordon提到的,在自动生成时,它不能引用其他表 您可以创建不存在的视图,如下所示:
create view v_price as
select p.*,
f.revenue * 10 as revenue_X_10
from price p
join finance f on f.d <= p.d
Where not exists
(select 1 from finance ff Where ff.d > f.d and ff.d <= p.d)
正如gordon提到的,在自动生成时,它不能引用其他表 您可以创建不存在的视图,如下所示:
create view v_price as
select p.*,
f.revenue * 10 as revenue_X_10
from price p
join finance f on f.d <= p.d
Where not exists
(select 1 from finance ff Where ff.d > f.d and ff.d <= p.d)
视图是否比OP当前的视图具有任何实际优势?谢谢!性能是否比使用select更好?我正在处理大量数据,之所以要这样做是为了存储数据,这样我就不必每次选择子查询了。@MonSh1rE。视图将具有相同的性能。如果出于性能原因需要汇总数据,可以创建触发器。与OP当前的视图相比,视图是否具有任何实际优势?谢谢!性能是否比使用select更好?我正在处理大量数据,之所以要这样做是为了存储数据,这样我就不必每次选择子查询了。@MonSh1rE。视图将具有相同的性能。如果出于性能原因需要汇总数据,可以创建触发器。谢谢!我能从中获得性能提升吗?我这样做的原因是,当我从中选择数据时,不会进行子查询。是的,不存在。连接通常比选择中的子查询快。哪一个是ff?我将内部的一个改为ff,但它只显示1个结果,而不是整个列。现在它应该给出正确的结果。是的,这比使用子查询更快。只花了不到一半的时间谢谢!我能从中获得性能提升吗?我这样做的原因是,当我从中选择数据时,不会进行子查询。是的,不存在。连接通常比选择中的子查询快。哪一个是ff?我将内部的一个改为ff,但它只显示1个结果,而不是整个列。现在它应该给出正确的结果。是的,这比使用子查询更快。只花了不到一半的时间