2016-12-30 1 views
-1

테이블이 food이고 두 열이 fruitspecies 인 두 개의 테이블이 있습니다. 각 종은 fruit의 값이 다른 여러 행을 가질 수 있습니다. 정확히 1 fruit을 먹는 모든 종을 찾고 해당 종에 대해 fruit의 값을 알고 싶습니다. HAVING 쿼리의 여러 용어

select species 
from food 
group by species 
having count(species) = '1' 

가 지금은 2 열, 하나 species 및 관련 fruit 다른 싶습니다

이 쿼리

fruit의 한 종류를 먹는 종을 발견했다. having 인수에서 여러 용어로 어떻게 쿼리합니까? 나는 시도 :

select species, fruit 
from food 
group by species 
having count(species) = '1' 

그러나 다음과 같은 오류 얻을 : 당신의 도움에 대한

ERROR: column "food.fruit" must appear in the 
GROUP BY clause or be used in an aggregate function 
LINE 1: select species, fruit 
           ^

감사합니다! (

select species, max(fruit) 
from food 
group by species 
having count(fruit) = 1 

우리가 각 종에 대한 "최대"과일을 선택이 방법을 :

+0

문자열과 숫자를 비교하지 마십시오. '1'은 숫자입니다. '1'은 숫자가 아닌 문자열 값입니다. –

+0

'과일이 = 1'입니까? – melpomene

+0

@a_horse_with_no_name SQL 또는 적어도 PostgreSQL TBH에서 꽤 괜찮습니다. ''1 '은 알 수없는 형식의 리터럴입니다. 예를 들어'NUMERIC' 리터럴을 지정하는 것은 실제로 _correct_ 방법입니다. 개인적으로 나는 명시 적으로'NUMERIC '1'을 쓰는 것을 선호하지만,''1 ''만이 OK이다. 타입은 연산자와 다른 인수로부터 유추된다. 프로토콜 매개 변수에 명시 적으로 유형을 지정하지 않는 한, 결국 bind 매개 변수를 사용하면 이러한 일이 발생합니다. –

답변

0

이 해킹의 약간 밖으로

select species, fruit 
    from food 
    where species in (select species 
         from food 
         group by species 
         having count(species) = 1) 
+1

데이터에 따라'count (distinct species)'가 필요할 수도 있습니다. –

0

이 시도하지만, 나는 다음과 일하는 것이 생각 영문자 순). 그러나 크기 1 세트의 최대 값을 선택하면 해당 요소가 반환됩니다.

0

과일을 얻으려면 하나의 집계 함수가 있어야합니다 (그룹화하지 않기 때문에 fruit). 하나의 과일 만 찾고 있으므로 집계 함수 min (또는 max, 중요하지 않음)을 사용하여 원하는 것을 얻을 수 있습니다. 예는 다음과 같습니다.

WITH food(fruit, species) AS 
(
    VALUES 
    ('apple', 'apple eater 1'), 
    ('apple', 'apple eater 2'), 
    ('orange', 'only orange eater'), 
    ('pear', 'only pear eater'), 
    ('melon', 'lots of fruits eater'), 
    ('watermelon', 'lots of fruits eater'), 
    ('strawberry', 'lots of fruits eater'), 
    ('strawberry', 'berry eater'), 
    ('blueberry', 'berry eater') 
) 

SELECT 
    species, min(fruit) AS fruit 
FROM 
    food 
GROUP BY 
    species 
HAVING 
    count(species)=1 
ORDER BY 
    species ;