Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我搞不懂的PostgreSQL错误_Sql_Database_Postgresql - Fatal编程技术网

我搞不懂的PostgreSQL错误

我搞不懂的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

我有一个SQL查询,它应该找到某个厨师的等级。 我应该计算这个厨师做的食谱的数量,计算 其他厨师的食谱,最终目标是获得我们的厨师排名, 也就是说,有多少厨师做的食谱比他做的少。 对不起,我的英语不好,解释太长

查询:

 /*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;