0

テーブルの1つで列を更新する際に問題が発生しました。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);

私のクエリはすべての注文の総コストを返します、そしてそれは私が私のテーブルに持ちたいものです。「単一行のサブクエリが複数の行を返す」というエラーが発生します。何が間違っているのかわからない、何か提案はありますか?

4

1 に答える 1

2

UPDATEを機能させるには、サブクエリ(SELECT SUM ...)が注文ごとに1つの行を返す必要があります。しかし、エラーメッセージによると、それは確かに複数の行を返します。

主な問題は確かに、更新される現在の行をサブクエリに関連付ける述語がないことです。したがって、少なくとも次のようなものをサブクエリに追加する必要があります。

o.ID_ORDER = ORDERS.ID_ORDER

さらに、GROUP BY句は、UPDATEに対して複数の行を生成する傾向があります。o.ID_ORDERのみに減らす必要があります。

3番目の問題は配送料です。これは合計する必要がありますが、最後に追加します。したがって、サブクエリから移動する必要があります。

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);
于 2012-12-04T06:50:04.293 に答える