错误:用作表达式的子查询返回的多行

时间:2018-05-17 19:14:05

标签: sql postgresql

ER图:

enter image description here

问题: 如果缺少该产品的销售数量,则在缺席的情况下向库存中添加新商品 所有销售额的20%合计,以确保它没有缺货。

我试过了:

UPDATE products SET current_stock=
(SELECT p.current_stock FROM sales 
INNER JOIN products AS p ON product_id=p.id
WHERE sold_count=(SELECT sold_count FROM sales
WHERE sold_count < sold_count * sold_count * 0.2 )) + 1;

但是我收到了这条错误消息:

ERROR:  more than one row returned by a subquery used as an expression

我正在使用PostgreSQL

3 个答案:

答案 0 :(得分:1)

您正尝试使用子查询更新current_stock,因此子查询必须返回 ONE 行, ONE 列( ONE 值)。

您的查询返回多行 - 可能在此处:

SELECT sold_count 
FROM sales
WHERE sold_count < sold_count * sold_count * 0.2

因为你要查询的每个sold_count低于某个......你可能有数百万......

从子查询更新时,必须确保查询结果只是一个值。

答案 1 :(得分:1)

我找到了解决方案:

UPDATE products SET current_stock = current_stock + 1
WHERE id = (SELECT p.id FROM sales 
INNER JOIN products AS p ON product_id=p.id
WHERE sold_count < sold_count * sold_count * 0.2
GROUP BY p.id);

我必须使用WHERE p.id = ...

答案 2 :(得分:0)

&lt;,=,&gt;,...等运算符期望从子查询返回标量结果。如果它返回多个,就像将苹果与一系列橙子进行比较。

我不完全理解这个问题,这是你想要做的吗?

UPDATE products
  FROM ( SELECT S.product_id,
                CASE WHEN S.sold_count >= SUM(S.sold_count) OVER() THEN P.current_stock + 1
                     ELSE P.current_stock
                 END adjusted_Stock
           FROM sales S
          INNER 
           JOIN product P 
             ON S.product_id = P.id
       ) AS UPDT
   SET current_stock = UPDT.adjusted_Stock
 WHERE id = UPDT.product_id;