postgresql出错

问题描述 投票:0回答:2

请帮忙!

count_rate := 
(
SELECT COUNT(trate.rid) AS count_rate 
FROM tlot LEFT JOIN trate ON trate.ridlot = tlot.lid 
GROUP BY tlot.lid
);

充分:

CREATE FUNCTION editstatuswait()
  RETURNS void
LANGUAGE plpgsql
AS $$
DECLARE count_rate INTEGER;
BEGIN
  count_rate := (SELECT COUNT(trate.rid) AS count_rate FROM tlot LEFT JOIN trate ON trate.ridlot = tlot.lid GROUP BY tlot.lid);

  IF (count_rate != 0) THEN
    UPDATE tlot SET lstatus = 3
    WHERE tlot.lexpirationdate < NOW()
    AND tlot.lexpirationdate > NOW()-INTERVAL '24 hours' AND tlot.lstatus = 2;
  ELSE
    UPDATE tlot SET lstatus = 0
    WHERE tlot.lexpirationdate < NOW()
    AND tlot.lexpirationdate > NOW()-INTERVAL '24 hours' AND tlot.lstatus = 2;
  END IF;
END;
$$;

错误:[21000]错误:用作表达式的子查询返回的多行Где:SQL语句SELECT (SELECT COUNT(trate.rid) AS count_rate FROM tlot LEFT JOIN trate ON trate.ridlot = tlot.lid GROUP BY tlot.lid

我无法理解如何摆脱这个错误......

sql postgresql plpgsql
2个回答
0
投票

解决方案取决于您要实现的目标。

变量只能包含单个值,因此您尝试存储在count_rate中返回多行的子选择的结果将失败。

您必须提出一个最多返回一行的子选择(如果它不返回任何行,则将为该变量分配NULL)。

  • 如果您只对第一行感兴趣(不太可能,因为没有ORDER BY),您可以将LIMIT 1附加到查询中。
  • 如果你只想要某个tlot.lid的计数,你应该使用WHERE tlot.lid = ...而不是GROUP BY
  • 如果要处理多个结果,可以使用如下结构: FOR count_rate IN SELECT ... LOOP ... END LOOP;

0
投票

删除GROUP BY

count_rate := (SELECT COUNT(trate.rid) AS count_rate FROM tlot LEFT JOIN trate ON trate.ridlot = tlot.lid);

当然,这可能不符合您的意图。它至少会修复错误。

© www.soinside.com 2019 - 2024. All rights reserved.