0

我在这里想要的是获得哪个学科已经有 4 个教室,如果它超过了发出通知并返回 null,并且有效。但是当我插入其他主题“2”时,代码会发出相同的通知,但我这个主题只有 1 个课堂。我知道我正在使用“ HAVING COUNT(cod_classroom) = 4”并且代码只能得到该主题已经有 4 个教室的内容。我试图只使用这个:“ SELECT DISTINCT cod_subject,COUNT(cod_classroom) AS CountOf FROM registration_subject GROUP BY cod_subject”但我不知道如何检查更多的值。

我希望你们都明白我想要什么,我尽力了=)提前谢谢大家

CREATE OR REPLACE FUNCTION quantas()
      RETURNS trigger AS
    $BODY$declare qtd record;

    begin

    SELECT * INTO qtd FROM (SELECT DISTINCT cod_subject,COUNT(cod_classroom) AS CountOf FROM registration_subject 
    GROUP BY cod_subject HAVING COUNT(cod_classroom) = 4) AS total;

    if found then

    raise notice 'This subject has already 4 classroom';

    return null;

    end if;

    end;$BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    ALTER FUNCTION qtd()
      OWNER TO postgres;
4

1 回答 1

0

除了克雷格在他的评论中提到的问题(需要锁定在独占模式),我认为你还有其他一些问题。

您的查询是这样的,对我来说没有多大意义。

  SELECT * INTO qtd 
    FROM (SELECT DISTINCT cod_subject,COUNT(cod_classroom) AS CountOf 
           FROM registration_subject 
GROUP BY cod_subject HAVING COUNT(cod_classroom) = 4) AS total;

我不相信这是执行此查询的非常有用的方法。事实上,一旦任何科目有 4 个教室,它会很有帮助地拒绝所有插入。

我会建议:

    PERFORM count(cod_classroom)
       FROM registration_subject
      WHERE cod_subject = NEW.subject
     HAVING count(*) >= 4;

PERFORM当您不关心使用结果时,在 plpgsql 中使用。在这里,您只关心是否找到它。其次,如果出现问题并且允许杂散插入,您仍然会阻止后续插入。如果任何科目恰好有四个教室,您的旧代码将阻止插入所有科目,但 5 个教室是可以的,这也不是您想要的。

于 2013-11-01T08:23:22.120 回答