ORACLE - 计算两个值并在视图中显示结果

Posted

技术标签:

【中文标题】ORACLE - 计算两个值并在视图中显示结果【英文标题】:ORACLE - Calculate two values and show result in a view 【发布时间】:2011-12-08 19:21:09 【问题描述】:

我从 Dave Costa 和 Justin Cave here(再次感谢)获得了如何从其他两个属性(数量和价格)计算小计值(因此数量 * 价格 = 小计)的出色帮助。在其中一个答案中指出,从规范化的角度来看,这样做并不好,因为小计值可以从其他两个属性中得出,我可能应该考虑使用视图。我已经阅读了 Views 并得到了这个概念(无论如何我都会在其他地方使用它们),但我仍然不确定如何实际计算这两个值并在自定义视图中显示结果。如果有人能指出我正确的方向,我将不胜感激。

当前触发器(归功于 Dave 和 Justin):

CREATE VIEW show_subtotal 
AS SELECT price 
FROM products
WHERE product_no =:new.product_no;

:new.subtotal := currentPrice * :new.quantity;

【问题讨论】:

【参考方案1】:

例如,这样的事情将通过将order_lineproduct 表连接在一起来计算小计,就像之前的触发器所做的那样。大概,您想要包含一些额外的属性(即订单号、订单行号等)

CREATE OR REPLACE VIEW order_line_with_subtotal( product_no,
                                                 quantity, 
                                                 price,
                                                 subtotal )
AS
SELECT ol.product_no,
       ol.quantity,
       p.price,
       (ol.quantity * p.price) subtotal
  FROM order_line ol
       JOIN product p ON (ol.product_no = p.product_no)

这与基于触发器的解决方案存在许多相同的数据一致性问题,因为当前价格是从product 表中引用的,而不是当时的价格存储在order_line 表中。如果您更改数据模型以便 order_line 表存储数量和当前价格,则视图会变得更简单,因为它不再需要连接到 product

CREATE OR REPLACE VIEW order_line_with_subtotal( product_no,
                                                 quantity, 
                                                 price,
                                                 subtotal )
AS
SELECT ol.product_no,
       ol.quantity,
       ol.price,
       (ol.quantity * ol.price) subtotal
  FROM order_line ol

如果你在 11g 上,你也可以在你的表定义中创建一个虚拟列,

CREATE TABLE order_line (
  order_line_no NUMBER PRIMARY KEY,
  order_no      NUMBER REFERENCES order( order_no ),
  price         NUMBER,
  quantity      NUMBER,
  subtotal      NUMBER GENERATED ALWAYS AS (price*quantity) VIRTUAL 
);

【讨论】:

以上是关于ORACLE - 计算两个值并在视图中显示结果的主要内容,如果未能解决你的问题,请参考以下文章

如何从 TextField 获取十进制值并在 Objective C 中使用它进行计算

在两个表之间同步并在 oracle 函数中显示结果

无法计算 tableViewCell 标签值

在 Oracle 中连接值并计算行数

从各种标签中获取值并进行简单计算

在两个 kivy 屏幕中添加两个值并得到结果