mysql中视图列的操作

pqwbnv8z  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(340)

我最近开始使用视图,出现了一个问题—是否可以对视图中的计算列执行任何操作?例如,有一个表:

CREATE TABLE IF NOT EXISTS schema.table(
row_id INT(255) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
val1 DOUBLE,
val2 DOUBLE);

在val1和val2中输入任意数据:

INSERT INTO schema.table (va1, val2) VALUES (1, 2);
INSERT INTO schema.table (va1, val2) VALUES (3, 4);
INSERT INTO schema.table (va1, val2) VALUES (5, 6);

我尝试基于表创建一个视图:

CREATE OR REPLACE
VIEW schema.table_VIEW
AS select
t1.row_id as row_id, 
LAG (val3,1,0) OVER() + t1.val1 - t1.val2 as val3,
from 
schema.table t1

我得到的错误是val3不存在于表中,这通常是合乎逻辑的。告诉我,这能实现吗?该视图的目标是得到一个列val3,其中最后一行中该列的值将被查看,val1将被添加,val2将从当前列中减去。
问题2—如果在表中创建一列val4,是否可以使用val3中的值动态更新它?

smdnsysy

smdnsysy1#

这基本上是一个滚动求和问题,将前一行的和加到当前行的计算中,以计算当前行的和。你可以在这里用相框。 ROWS UNBOUNDED PRECEDINGSUM() 函数可以用来考虑 val1 - val2 从第一行到当前行的值。

CREATE OR REPLACE
VIEW schema.table_VIEW
AS select
     t1.row_id as row_id, 
     SUM(t1.val1 - t1.val2) OVER(ORDER BY t1.row_id
                                 ROWS UNBOUNDED PRECEDING) AS val3
   from 
     schema.table t1

架构(mysql v8.0)

CREATE TABLE IF NOT EXISTS test(
row_id INT(255) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
val1 DOUBLE,
val2 DOUBLE);

INSERT INTO test (val1, val2) VALUES (1, 2);
INSERT INTO test (val1, val2) VALUES (3, 4);
INSERT INTO test (val1, val2) VALUES (5, 6);

CREATE OR REPLACE
VIEW test_VIEW
AS select
     t1.row_id as row_id, 
     SUM(t1.val1 - t1.val2) OVER(ORDER BY t1.row_id
                                 ROWS UNBOUNDED PRECEDING) AS val3
   from 
     test t1

查询#1

select * from test_VIEW;

| row_id | val3 |
| ------ | ---- |
| 1      | -1   |
| 2      | -2   |
| 3      | -3   |

db fiddle视图

相关问题