2011-12-08 45 views
2

我有這個SQL查詢應該找到某個廚師的排名。 我應該計算這個廚師做的食譜的數量,計算其他廚師食譜的數量,最後的目標是得到我們的廚師排名, 這是廚師做的食譜少,然後他做了。 (對不起,對我的英文不好,長時間的解釋)。PostgreSQL錯誤,我想不出

查詢:

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

有問題的線是一個用箭頭;從「記錄」類型 這樣的變量中獲取數據可以嗎? 我在這裏做錯了什麼?

+0

我不認爲這是你得到的錯誤的重要信息,但是當你分組時,你確實不需要DISTINCT。 –

+0

目前還不清楚你的uidSum是什麼記錄。在INTO子句中使用簡單變量'uSum'和'ranking':'INTO uSum,排名'。這很有可能會起作用。 (我根本不知道PostgreSQL中的記錄符號,這是這是一個評論而不是答案的原因之一。) –

+1

您還應該發佈從您發佈的SQL中獲得的確切錯誤消息;它讓人們更容易幫助你。 –

回答

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

不知道我是怎麼看不到的......謝謝! – Itzik984

+0

它發生在我們所有人身上! :) –

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,a DISTINCT在這個特殊情況下是沒有意義的。

  • 不要使用函數的名稱(sum)作爲列名。只會導致問題。

  • 使用正確的名稱,不需要雙引號("sum")。只是我的建議,並不完全錯誤。

  • 您可以使用混合大小寫標識符,但不要。如果不加雙引號,標識符會摺疊爲小寫。 Read about identifiers in the manual

  • 如同你GROUP BY uid,最好用count(*)而不是count(uid)。在uid可能爲NULL(不太可能?)的情況下稍快並且效果更好 - 那麼您也可以計算NULL - 個案。

盪滌形式(還是錯的!):

SELECT uid, count(*) as ct INTO uidSum 
FROM hascooked 
GROUP BY uid; 

的說法仍然是錯誤的,因爲你嘗試分配多行單變量uidSum,這是不可能的。

一個record可容納多列,不多行。您需要一個table或將這些行聚合爲一個。

只有第一行將被分配,這是挑選在隨機因爲你沒有ORDER BYDISTINCT用於確保結果集按DISTINCT列排序,但從版本8.4開始不再有效。我引用release notes for 8.4

SELECT DISTINCT和UNION/INTERSECT/EXCEPT不再總是產生 有序輸出(湯姆)

在任何情況下,順序按uid是在檢索單列爲無意義這個背景。這顯然不是你想要的。另一種方法是逐個循環遍歷結果行。 More about loops here

正確的解決辦法就是我上面的查詢。