我目前正在一个SQL项目上工作,我的代码只是不会工作,这是我尝试的
UPDATE detail_order
SET total = (
SELECT (detail_order.quantity*product.PRICE_EXCLVAT)
FROM detail_order,product
where detail_order.npro=product.npro
);
但是oracle一直告诉我:ora-01427单行子查询返回多于一行。但我不知道如何解决这个问题,因为每个产品都有一个价格,每个订单只与一个产品相关联,所以没有混淆。有些产品被订购了好几次,但我看不出这有什么问题。
应该是这样的:
update detail_order d set
d.total = (select d.quantity * p.price_exclvat
from product p
where p.npro = d.npro
)
where exists (select null from product a
where a.npro = d.npro
);
或
merge into detail_order d
using product p
on (p.npro = d.npro)
when matched then update set d.total = d.quantity * p.price_exclvat;
这些都不起作用(即,如果product
表中有多个npro
与detail_order
的npro
匹配的行,您将再次获得too_many_rows
。
那该怎么办呢?这取决于你自己;我们没有你们的桌子,也不知道你们的要求是什么。
我相信你想要的是这样的:
update detail_order d
set total = quantity *
(select price_exclvat from product where npro = d.npro)
;
quantity
是来自您正在更新的同一行的数量。没有理由引用detail_order
来检索行的数量。