我正在创建一个包含四个不同表的数据库:
CUSTOMER
我需要创建一个1)的事务。将数据插入新的INVOICE
,2)。将数据插入新的INVOICE_ITEM
(发票金额设置为0),3)。插入两个新INVOICE_ITEM_QUANTITY
的数据(一行INVOICE_ITEM_PRICE
设置为2,INVOICE_AMOUNT
设置为5.00,另一行设置为1和10.00。
我可以使用insert命令完成所有这些操作,但下一步是让我失望:
'更新INVOICE_AMOUNT,将步骤3中添加的订单项添加到INVOICE_ITEM_PRICE字段。您必须使用一个查询来执行此操作,无论此INVOICE是否存在INVOICE_ITEM行。您的查询无法对金额进行硬编码。'
我无法弄清楚我将如何做到这一点。我一直在研究解决方案,但没有找到任何描述这个问题的东西,只有在列名相同时才有效。
我可以直接将值插入UPDATE INVOICE
,但是它会被认为是难以编码的答案,对吗?所以我一直在努力做一些事情
SET INVOICE_ITEM.INVOICE_ITEM_PRICE = INVOICE.INVOICE_AMOUNT
WHERE INVOICE.INVOICE_ID = INVOICE_ITEM.INVOICE_ID
{{1}}
但我无法使用此代码的任何变体。我确信有一些非常简单的答案会让我感到愚蠢,但如果有人能提供帮助,我会非常感激。
答案 0 :(得分:0)
这可能有点笨拙,但考虑到你所拥有的,并没有表明当时使用PL / SQL;
UPDATE invoice i
SET i.invoice_amount = (SELECT SUM(ii.invoice_item_quantity * ii.invoice_item_price)
FROM invoice_item ii
WHERE ii.fk_invoice_id = 1.invoice_id)
WHERE i.invoice_id = (SELECT MAX(invoice_id)
FROM invoice
WHERE fk_cust_id = (SELECT MAX(cust_id)
FROM customer) )
所以。 。 。将发票金额设置为发票的发票项目的数量*价格总和。只需更新具有最新发票ID且最新发票适用于最新客户的发票记录。 这假设您使用序列创建PK值(发票应该采用最新的发票号并向其添加1)。其他可能是简单的Oracle序列。 抱歉笨拙,但这是一个虚拟的星期五,我即将回家。
答案 1 :(得分:0)
你可以制作一个更新invoice_ammount的触发器。像这样:
CREATE OR REPLACE TRIGGER tg_invoice_item_amt
AFTER
DELETE OR
INSERT OR
UPDATE OF invoice_item_quantity, invoice_item_price
ON invoice_item
FOR EACH ROW
DECLARE
l_change_amt NUMBER;
BEGIN
CASE
WHEN INSERTING THEN
l_change_amt := COALESCE(:NEW.invoice_item_quantity * :NEW.invoice_item_price, 0);
WHEN UPDATING THEN
l_change_amt := COALESCE(:NEW.invoice_item_quantity * :NEW.invoice_item_price, 0)
- COALESCE(:OLD.invoice_item_quantity * :OLD.invoice_item_price, 0);
WHEN DELETING THEN
l_change_amt := 0 - COALESCE(:OLD.invoice_item_quantity * :OLD.invoice_item_price, 0);
END CASE;
IF l_change_amt != 0 THEN
UPDATE invoice SET invoice_amount = invoice_amount + l_change_amt;
END;
/