Oracle 数据库中的虚拟列

virtual column in Oracle database

我在 table 中有 5 列。我必须将 difference of max value and min value 存储在另一个 column 中。我正在使用以下查询。这里 a b c d e 是列名。

ALTER TABLE samples ADD
(Range_value NUMBER(10,2) GENERATED ALWAYS
 AS (max(a,b,c,d,e)-Min(a,b,c,d,e)) VIRTUAL);

我遇到了以下错误。

Error starting at line : 28 in command -
ALTER TABLE samples ADD
(Range_value NUMBER(10,2) GENERATED ALWAYS
 AS (max(a,b,c,d,e)-Min(a,b,c,d,e)) VIRTUAL)
Error report -
ORA-00934: group function is not allowed here
00934. 00000 -  "group function is not allowed here"
*Cause:    
*Action:

如果群组功能不能使用,有没有办法解决?

我建议你使用 GREATEST 和 LEAST

ALTER TABLE samples ADD
(Range_value NUMBER(10,2) GENERATED ALWAYS
 AS (GREATEST (a,b,c,d,e)-LEAST(a,b,c,d,e)) VIRTUAL);

参见:db<>fiddle here

这些函数适用于当前行,可用于您的虚拟列,而 MIN/MAX 跨多行运行,不能用于您的虚拟列。

如果您确实需要跨多行操作,那么视图可能是最简单的选择。