sql oracle - 使用select更新

时间:2012-12-04 06:42:59

标签: sql oracle select

我在更新其中一个表中的列时遇到问题。我有一个名为ORDERS的表,我在表中添加了一个新列,表示订单的总成本。我通过使用计算成本的查询来获得总成本。现在我正在尝试使用该选择查询来使用更新来填充表中的该列。这就是我所拥有的:

update ORDERS
set TOTAL_COST = (
select sum((p.COST*i.QUANTITY)*(1-o.DISCOUNT))+delivery(o.DELIVERY) as TOTAL_COST
from PRODUCT p, ITEM i, ORDERS o
where p.ID_PRODUCT = i.ID_PRODUCT and i.ID_ORDER = o.ID_ORDER
group by o.ID_ORDER, o.DISCOUNT, o.DATE, o.DELIVERY);

我的查询返回每个订单的总成本,这就是我想要在表格中拥有的内容。我得到一个“单行子查询返回多行”错误。 我不知道我做错了什么,有什么建议吗?

1 个答案:

答案 0 :(得分:2)

为了使UPDATE正常工作,子查询(SELECT SUM ...)需要为每个订单返回一行。但是根据错误消息,它肯定会返回多行。

主要问题当然是没有谓词将要更新的当前行与子查询相关联。所以你至少需要在子查询中添加这样的东西:

o.ID_ORDER = ORDERS.ID_ORDER

此外,GROUP BY子句倾向于为UPDATE生成多个行。它只需要减少到o.ID_ORDER。

第三个问题是交付成本,应该加总,但最后加上。所以他们必须被移出子查询:

update ORDERS
set TOTAL_COST = (
  select sum((p.COST*i.QUANTITY)*(1-o.DISCOUNT)) as TOTAL_COST
  from PRODUCT p, ITEM i, ORDERS o
  where o.ID_ORDER = ORDERS.ID_ORDER and p.ID_PRODUCT = i.ID_PRODUCT and i.ID_ORDER = o.ID_ORDER
  group by o.ID_ORDER
) + delivery(DELIVERY);