Postgresql 将聚合和函数压缩到postgres中的数字

Postgresql 将聚合和函数压缩到postgres中的数字,postgresql,sum,case,Postgresql,Sum,Case,我有下一个不起作用的查询: UPDATE item SET popularity= (CASE WHEN (select SUM(io.quantity) from item i NATURAL JOIN itemorder io GROUP BY io.item_id) > 3 THEN TRUE ELSE FALSE END); 在这里,我想将每行内部选择和值与3

我有下一个不起作用的查询:

UPDATE item

SET popularity= (CASE
                    WHEN (select SUM(io.quantity) from item i NATURAL JOIN itemorder io GROUP BY io.item_id) > 3 THEN TRUE
                    ELSE FALSE
                    END);
在这里,我想将每行内部选择和值与3进行比较,并更新流行度。但是SQL给出了一个错误:

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

我知道Internal SELECT返回许多值,但smb能否帮助我比较每一行。换句话说,生成循环。

当使用子查询时,您需要返回一行,因此您实际上是在对item表中的每条记录进行查询

UPDATE item i
SET popularity = (SELECT SUM(io.quantity) FROM itemorder io 
                  WHERE io.item_id = i.item_id) > 3;
另一种方法(postgresql扩展)是在FROM子句中使用派生表

UPDATE item i2
SET popularity = x.orders > 3
FROM (select i.item_id, SUM(io.quantity) as orders
from item i NATURAL JOIN itemorder io GROUP BY io.item_id) 
     as x(item_id,orders)
WHERE i2.item_id = x.item_id
在这里,您正在像以前一样执行单个group子句,我们将加入表以使用组的结果进行更新