2016-12-30 3 views
-1

У меня есть таблица food с двумя колонками: fruit и species. Каждый вид может иметь несколько строк с разными значениями fruit. Я хочу найти всех видов, которые едят ровно 1 fruit, и знать значение fruit для этих видов.Несколько терминов в запросе HAVING

Этот запрос работал, чтобы найти виды, которые едят только один вид fruit:

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

Теперь я хотел бы 2 колонки, один 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

. Разве это не должно быть 'count count (fruit) = 1'? – melpomene

+0

@a_horse_with_no_name Это нормально в SQL или, по крайней мере, PostgreSQL TBH, '' 1'' - это буквально неизвестный тип. На самом деле, _correct_ способ указать литерал 'NUMERIC', например. Лично я предпочитаю быть явным и писать 'NUMERIC '1'', но просто' '1'' тоже в порядке, тип выводится из оператора и другого аргумента. Это произойдет, если вы используете параметр привязки в конце концов, если вы явно не укажете его тип в сообщении протокола. –

ответ

0

Попробовать это

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

В зависимости от данных вам может понадобиться 'count (отдельные виды)' –

0

Это немного рубить, но я считаю, что следующий будет работать:

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

Этот путь мы выбираем «максимум» фрукты для каждого вида (в алфавитном порядке). Но выбор максимума набора 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 ; 
Смежные вопросы