尝试使用psql创建更新一个表并从另一个表中删除数据的函数

尝试使用psql创建更新一个表并从另一个表中删除数据的函数,sql,function,subquery,Sql,Function,Subquery,我正在为我的班级做一个项目,我们被告知要做一个函数,该函数将删除与特定购物车编号有关的数据,并更新products表。该函数只有一个输入,即购物车编号。以下是我所拥有的: create function clear_cart(text) returns void as $$ update products set qtyonhand = qtyonhand + (select qty from cart where cart_id = $1) where id in (sel

我正在为我的班级做一个项目,我们被告知要做一个函数,该函数将删除与特定购物车编号有关的数据,并更新products表。该函数只有一个输入,即购物车编号。以下是我所拥有的:

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)
它将多个值返回到只接受一个值的字段中。我试着在其他地方寻找,但我不确定在哪里可以找到与我正在尝试的类似的子查询。任何帮助都将不胜感激

以防万一,以下是该项目所说的:

参数:cart\u id char

退货:无


描述:从指定购物车中删除所有项目。适当地调整产品的库存量。

您可能只需要一个UPDATE语句,就可以通过使用表中声明的类似于ON UPDATE CASCADE的语句来实现这一点

所以,如果您在一个名为child的表中声明了这一点。Fk是对表父级的引用,当父级得到更新时,它会在子级中删除该行

FOREIGN KEY (parent_id)
        REFERENCES parent(id)
        ON UPDATE CASCADE

您没有向我们展示您的数据模型,但是从您给出的语句来看,我假设您想要这样的东西:

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
表只包含每个产品的一行。如果不是这样,您将得到“sub-select还返回多行”

在这种情况下,您需要应用聚合函数:

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;

这并不能解决子查询返回的多行的问题。似乎您可以在有问题的子查询中将
qty
替换为
sum(qty)
,但是(第二个建议)可能是一个更好的选择。这很有效。我认为我不能在from语句中使用子查询。非常感谢你!哦,如果有帮助的话,我的表看起来是这样的:创建表购物车(购物车id文本,产品id文本引用产品(id),数量数字);