【问题标题】:sql oracle - update using selectsql oracle - 使用选择更新
【发布时间】:2012-12-04 15:28:14
【问题描述】:

我在更新我的一个表中的列时遇到问题。我有一个名为 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);

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

【问题讨论】:

    标签: sql oracle select


    【解决方案1】:

    为了让您的 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);
    

    【讨论】:

    • 我进行了进一步的修复,并将运费从子查询中移出。
    • 感谢您的帮助,但我不认为问题可以通过这种方式解决,我最好创建一个新表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多