Мне нужен запрос, который будет возвращать отдельные строки, но не будет возвращать строки, у которых есть повторяющиеся фрукты, где одна из строк - "Утверждено". Примечание: всегда будет не более двух плодов с одинаковым именем.
Например, идеальным результатом будет:
До сих пор я просто:
SELECT DISTINCT * FROM Food;
Но это, очевидно, все еще возвращает одну из строк, в которой есть "Apple",
Вы можете использовать некоторую условную агрегацию для желаемого набора результатов, например
select fruit, min(status)
from demo
group by fruit
having sum(status = 'Approved') = 0
and sum(status = 'Bought') > 0
или просто select fruit, 'Bought' as status
SELECT DISTINCT * FROM Food WHERE Fruit NOT IN (SELECT (UNIQUE Fruit) FROM Food WHERE Status = 'Approved');
Попробуйте этот запрос.
Думаю, вы могли бы решить эту проблему по-другому? Чтобы получить тот же результат, вы могли бы добавить предложение WHERE
, например:
SELECT DISTINCT * FROM Food WHERE Status = 'Bought';
Вы также можете изменить модель данных, чтобы обновить статус фруктов, а не добавлять другую запись для одного и того же фрукта (если это подходит для целей приложения).
Если вы хотите сохранить схему и получить то же самое, я считаю, что вы можете сделать: SELECT DISTINCT on (Fruit) Fruit, Status FROM Food ORDER BY Fruit, Status ASC;
NOT EXISTS
, попробуйтеGROUP BY
сHAVING
и т. Д.