1

私はクラスのプロジェクトに取り組んでおり、特定のカート番号に関連するデータを削除して製品テーブルを更新する関数を作成するように指示されました。この関数には、カート番号という1つの入力しかありません。これが私が持っているものです:

create function clear_cart(text) returns void as
$$

  update products
     set qtyonhand = qtyonhand + (select qty from cart where cart_id = $1)
  where id in (select product_id from cart where cart_id = $1);

  delete from cart where cart_id = $1;

$$ language sql;

クエリを直接psqlに入れてテストしてきましたが、回避できないと思われるエラーが発生しています。

set qtyonhand = qtyonhand + (select qty from cart where cart_id = $1)

1つだけを受け入れるフィールドに複数の値を返します。他の場所を探してみましたが、自分がやろうとしていることに似たサブクエリをどこで見つけることができるかわかりません。どんな助けでもいただければ幸いです。

念のため、プロジェクトの内容は次のとおりです。

パラメータ:cart_id char

戻り値:なし

説明:指定されたカートからすべてのアイテムを削除します。製品の在庫数量を適切に調整してください。

4

2 に答える 2

2

あなたは私たちにあなたのデータモデルを見せませんでした、しかしあなたが与えたステートメントから、私はあなたがこのようなものが欲しいと思います:

update products
   set qtyonhand = qtyonhand + t.qty
from (select product_id, 
             qty 
      from cart 
      where cart_id = $1) t
where products.id = t.product_id;

cartこれは、テーブルが製品ごとに1つの行のみを保持することを前提としています。そうでない場合は、「副選択でも複数の行が返される」というメッセージが表示されます。

その場合、集計関数を適用する必要があります。

update products
   set qtyonhand = qtyonhand + t.total_qty
from (select product_id, 
             sum(qty) as total_qty
      from cart 
      where cart_id = $1
      group by product_id) t
where products.id = t.product_id;
于 2012-05-14T07:50:43.500 に答える
0

You could probably do this with just an UPDATE statement by using something like ON UPDATE CASCADE declared in your table.

So if you have this declared in a table called child. Fk is a reference to a table parent, when that parent gets updated it drops the row in child.

FOREIGN KEY (parent_id)
        REFERENCES parent(id)
        ON UPDATE CASCADE
于 2012-05-14T07:33:31.393 に答える