2011-12-08 2 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, ranking'. 일할 수있는 아주 좋은 기회가 있습니다. (나는 단순히 PostgreSQL의 레코드 표기법에 대해서 알지 못합니다. 이는 대답이 아닌 주석입니다. –

+1

게시 한 SQL에서 얻은 정확한 오류 메시지도 게시해야합니다. 사람들이 당신을 도울 수있게 해줍니다. –

답변

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

내가 어떻게 그 didnt하는지에 관해 안다. .. 고맙다! – Itzik984

+0

그것은 우리 모두에게 일어납니다! :) –

1

우선, plpgsql 기능이 필요하지 않습니다. 일반 쿼리가 작업을 수행합니다. CTE이 경우에 도움이 :

    :

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

    이 점은 내 조언을 엄격하게 잘못되지 않습니다

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

    다음으로, 사물의 수는이 문 잘못

  • 당신은 이미 GROUP BY uid, 이 특별한 경우에는이 무의미합니다.

  • 열 이름으로 함수 이름 (sum)을 사용하지 마십시오. 문제 만 일으킨다.

  • 적절한 이름을 사용하면 큰 따옴표 ("sum")가 필요하지 않습니다. 충고 만하고 잘못이 아닙니다.

  • 대소 문자를 혼용 할 수 있지만 사용하지 마십시오. 식별자는 큰 따옴표로 묶지 않으면 소문자로 접 힙니다. Read about identifiers in the manual.

  • GROUP BY uid으로 count(uid) 대신 count(*)을 사용하는 것이 더 좋습니다. uidNULL 일 수있는 (예상치 못한 경우) 결과가 약간 빠르고 빠르며 더 나은 결과를 얻은 경우 - NULL 사례도 계산됩니다.

양식 정리 (여전히 잘못!) :

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

당신이 가능하지 않은, 하나의 변수 uidSum에을 여러 행을 할당하려고하기 때문에 문이 여전히 잘못 .

record

여러 열하지 여러 행을 보유 할 수 있습니다. 행을 하나로 합치려면 table이 필요합니다.

임의 번호에서 선택되는 첫 번째 행만 ORDER BY으로 지정됩니다. DISTINCT은 결과 집합이 DISTINCT 열에 의해 정렬되도록 보장하기 위해 사용되지만 버전 8.4 이후에는 더 이상 사실이 아닙니다. 나는 release notes for 8.4

가 DISTINCT SELECT 인용 더 이상 항상 분류 출력 (톰) 어떤 경우

을 생산하지 제외하고 UNION/INTERSECT는/uid에 의해 순서에 단일 행을 검색하는만큼 무의미하다 이 문맥. 그것은 분명히 당신이 원하는 것이 아닙니다. 한 가지 다른 방법은 하나씩 결과 행을 반복하는 것입니다. More about loops here.

적절한 해결책은 위의 쿼리입니다.

관련 문제