我搞不懂的PostgreSQL错误
我有一个SQL查询,它应该找到某个厨师的等级。 我应该计算这个厨师做的食谱的数量,计算 其他厨师的食谱,最终目标是获得我们的厨师排名, 也就是说,有多少厨师做的食谱比他做的少。 对不起,我的英语不好,解释太长 查询:我搞不懂的PostgreSQL错误,sql,database,postgresql,Sql,Database,Postgresql,我有一个SQL查询,它应该找到某个厨师的等级。 我应该计算这个厨师做的食谱的数量,计算 其他厨师的食谱,最终目标是获得我们的厨师排名, 也就是说,有多少厨师做的食谱比他做的少。 对不起,我的英语不好,解释太长 查询: /*Compute Cooking Rank*/ create or replace function ComputeCookingRank(u integer) returns integer as $$ declare uidSum record; uSum i
/*Compute Cooking Rank*/
create or replace function
ComputeCookingRank(u integer)
returns integer as $$
declare
uidSum record;
uSum integer;
ranking integer;
begin
select distinct uid,count(uid) as "sum" into uidSum from HasCooked group by uid;
---> select distinct into uSum from uidSum where uid=u;
select count(uid) into ranking from uidSum where uid=u and sum<uSum;
end;
$$ language plpgsql;
有问题的线是带箭头的线;从“记录”类型获取数据可以吗
像这样的变量?
我在这里做错了什么?首先,您不需要plpgsql函数。一个简单的查询就可以完成这项工作。A在这种情况下有助于:
select distinct /* you list no columns here */ into uSum from uidSum where uid=u;
WITH x AS (
SELECT uid, count(*) as ct
FROM hascooked
GROUP BY uid
)
SELECT count(*) AS cooks_with_fewer_recipies
FROM x
WHERE ct < (SELECT ct FROM x WHERE uid = u);
以下几点只是我的建议,并非完全错误:
您已经按uid分组了,在这种特殊情况下,DISTINCT是没有意义的
不要使用函数和的名称作为列名。只会导致问题
如果名称正确,则不需要双引号和。只是我的建议,并没有完全错误
您可以使用混合大小写标识符,但不能。如果不是双引号,标识符将折叠为小写
按uid分组时,最好使用count*而不是countuid。稍微快一点,在不太可能的情况下取得更好的结果?如果uid可能为空,那么您也会得到空情况的计数
已清理的表单仍然错误!:
该语句仍然错误,因为您试图将多行分配给单个变量uidSum,这是不可能的
一条记录可以容纳多列,而不是多行。您需要一个表,或者将行聚合为一个表
将只分配第一行,这是随机选取的,因为您没有ORDER BY。DISTINCT用于确保结果集按DISTINCT列排序,但自版本8.4以来,这种情况不再成立。我引述
选择DISTINCT和UNION/INTERSECT/EXCEPT不再始终生成
排序输出汤姆
在任何情况下,按uid排序与在此上下文中检索一行一样毫无意义。这显然不是你想要的。另一种方法是逐个循环遍历结果行
正确的解决方案是我上面的查询。我认为这与您所遇到的错误无关,但在分组时确实不需要使用DISTINCT。您的uidSum是什么记录尚不清楚。在INTO子句中使用简单变量uSum和ranking:INTO uSum,ranking。这很有可能奏效。我只是不知道PostgreSQL中的记录符号,这也是为什么这是一个注释而不是答案的原因之一;它使人们更容易帮助你。你的函数在出现小的语法错误之前就出了问题。看看我的综合答案。至少应该有一个回报排名;在某处
select distinct uid,count(uid) as "sum" into uidSum from HasCooked group by uid;
SELECT uid, count(*) as ct INTO uidSum
FROM hascooked
GROUP BY uid;