我有下一个不起作用的查询:
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);
这里我想将内部SELECT SUM值的每一行与3进行比较并更新流行度。但SQL给出错误:
ERROR: more than one row returned by a subquery used as an expression
我理解内部SELECT返回许多值,但是smb可以帮助我比较每一行。换句话说,make loop。
答案 0 :(得分:1)
使用子查询时,您需要返回一行,这样您就可以有效地对项目表中的每条记录进行查询。
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
这里你正在做一个单独的组子句,我们正在加入表格以更新组的结果。