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_line
和product
表连接在一起来计算小计,就像之前的触发器所做的那样。大概,您想要包含一些额外的属性(即订单号、订单行号等)
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 - 计算两个值并在视图中显示结果的主要内容,如果未能解决你的问题,请参考以下文章