PostgreSQL错误,我无法弄清楚

时间:2011-12-08 23:36:49

标签: sql database postgresql

我有这个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; 

有问题的线是带箭头的线;是否可以从“记录”类型中获取数据 像这样的变量? 我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

select distinct /* you list no columns here */ into uSum from uidSum where uid=u;

答案 1 :(得分:1)

首先,您不需要plpgsql函数。一个普通的查询完成这项工作。在这种情况下,CTE会有所帮助:

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);

接下来,使用此声明数量错误

select distinct uid,count(uid) as "sum" into uidSum from HasCooked group by uid;

这些观点只是我的建议,并非严格错误:

  • 您已经 GROUP BY uid DISTINCT 在这种特殊情况下毫无意义。

  • 请勿使用函数名称(sum)作为列名。只会导致问题。

  • 使用正确的名称,您不需要双引号("sum")。只是我的建议,并非严格错误。

  • 您可以使用混合大小写标识符,但不能。如果不是双引号,标识符将折叠为小写。 Read about identifiers in the manual

  • GROUP BY uid一样,最好使用count(*)代替count(uid)。 <{1}}可能是uid的(不太可能?)情况稍快一点,效果更好 - 那么你也得到NULL个案例的计数。

清理表单(仍然错误!):

NULL

该陈述仍然有误,因为您尝试将多行分配给单个变量SELECT uid, count(*) as ct INTO uidSum FROM hascooked GROUP BY uid; ,这是不可能的。

uidSum可以包含多列,而不是多行。您需要record或将行汇总为一个。

只会分配第一行,因为您没有table,所以会选择随机ORDER BY用于保证结果集按DISTINCT列排序,但自8.4版以来不再适用。我引用release notes for 8.4

  

SELECT DISTINCT和UNION / INTERSECT / EXCEPT不再总是产生   排序输出(汤姆)

在任何情况下,按DISTINCT排序与在此上下文中检索单行一样无意义。这显然不是你想要的。另一种方法是逐个遍历生成的行。 More about loops here

正确的解决方案是我上面的查询。