postgresql-11 - 您可以在 postgresql 的存储过程中的插入语句中的临时行上引用聚合函数吗?
问题描述
我正在编写一个 postgres 存储过程,它遍历从 select 语句返回的行。对于它循环通过的每一行,它将来自该 select 语句的值插入到一个新表中。我需要插入第二个表的值之一是一列的平均值。但是,当我调用存储过程时,我收到一个错误,即临时行没有我正在平均的实际列的属性。请参阅下面的存储过程和错误。
存储过程:
create or replace procedure sendToDataset(sentence int)
as $$
declare temprow peoplereviews%rowtype;
BEGIN
FOR temprow IN
select rulereviewid, avg(rulereview)
from peoplereviews
where sentenceid = sentence
group by rulereviewid
loop
insert into TrainingDataSet(sentenceId, sentence, ruleCorrectId, ruleCorrect, dateAdded)
values(sentence, getSentenceFromID(sentence), tempRow.rulereviewid, tempRow.avg(rulereview), current_timestamp);
END LOOP;
END
$$
LANGUAGE plpgsql;
错误:
ERROR: column "rulereview" does not exist
LINE 2: ...omID(sentence), tempRow.rulereviewid, tempRow.avg(rulereview...
^
QUERY: insert into TrainingDataSet(sentenceId, sentence, ruleCorrectId, ruleCorrect, dateAdded)
values(sentence, getSentenceFromID(sentence), tempRow.rulereviewid, tempRow.avg(rulereview), current_timestamp)
CONTEXT: PL/pgSQL function sendtodataset(integer) line 11 at SQL statement
SQL state: 42703
基本上,我想知道是否可以在插入语句中使用该聚合函数,如果没有,是否有其他方法。
解决方案
您不需要为此使用缓慢且低效的循环:
insert into TrainingDataSet(sentenceId, sentence, ruleCorrectId, ruleCorrect, dateAdded)
select getSentenceId(sentence), sentence, rulereviewid, avg(rulereview), current_timestamp
from peoplereviews
where sentenceid = sentence
group by rulereviewid
要回答原始问题:您需要为聚合提供适当的别名:
FOR temprow IN
select rulereviewid, avg(rulereview) as avg_views
from peoplereviews
where sentenceid = sentence
group by rulereviewid
loop
insert into TrainingDataSet(sentenceId, sentence, ruleCorrectId, ruleCorrect, dateAdded)
values(sentence, getSentenceFromID(sentence), tempRow.rulereviewid,
tempRow.avg_views, current_timestamp);
END LOOP;
推荐阅读
- r - 在R中删除格式为www的url
- powerbi - Power Bi 中的组成员
- java - 无法在 JDK13 上运行 dacapo 基准测试
- concurrency - 在以下 Clojure 代码中,alter 可以替换为 commute 吗?
- git - TFS:如何授予 NETWORK SERVICE 用户允许 git push/pull 的权限?
- java - 如何在左端设置水平滚动窗格的起始位置?
- reactjs - 如何在不刷新客户端的情况下动态指示另一个用户正在编辑记录
- python - 我们如何构建一个节点 api,它将向用户发送邮件并生成 otp 以访问我的 python 微服务
- react-native - 在一行中渲染两个图像反应原生
- python - 当我在 python 中使用列表类型变量时,我不明白逻辑。为什么它以这种方式工作?