Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中添加具有相关子查询的自动生成列_Mysql_Sql - Fatal编程技术网

在mysql中添加具有相关子查询的自动生成列

在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

我想添加一个根据其他表自动生成值的列。有两个表可供使用

表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 * 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个结果,而不是整个列。现在它应该给出正确的结果。是的,这比使用子查询更快。只花了不到一半的时间