2016-12-30 9 views
-1

私はテーブルfoodと2つのカラム:fruitspeciesを持っています。各種は、異なる値のfruitの複数の行を持つことができます。私はちょうど1 fruitを食べて、これらの種の値がfruitであることを知っているすべての種を探したい。HAVINGクエリの複数の用語

このクエリは、fruitの唯一の1種類を食べる種を見つけるために働いていた:

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

は、今私は2列、1 speciesおよびその他の関連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 
           ^

感謝を!

+0

数字を文字列と比較しないでください。 '1'は数字です '' 1 'は数字ではなく文字列の値です –

+0

「果物(果物)= 1」を持つ必要はありませんか? – melpomene

+0

@a_horse_with_no_nameこれはSQLでもPostgreSQLのTBHでも大丈夫です。「1」は未知型のリテラルです。実際には、たとえば 'NUMERIC'リテラルを指定するための_correct_方法です。個人的に私は明示的に 'NUMERIC '1' 'を書いていますが、' '1' 'だけでもOKです。型は演算子や他の引数から推論されます。プロトコルメッセージに型を明示的に指定しないかぎり、バインドパラメータを使用すると、これが起こります。 –

答えて

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

これを試してみてください:

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

我々は(それぞれの種のために「最大」の果実を選択し、この方法アルファベット順)。しかし、サイズ1のセットの最大値を選択すると、その要素が返されます。

0

フルーツを手に入れるには集計機能が必要です(グループ化していないのでfruit)。ただ一つの果物を探しているときは、集計関数min(またはそれは問題ではありません)を使用して、必要なものを得ることができます。例は次のとおりです。

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 ; 
関連する問題