У меня есть эта схема:
ЧЕЛОВЕК (имя, пол)
ЧАСТОТЫ (Имя, Магазин)
У меня вопрос, как мне найти магазины, клиентами которых являются исключительно мужчины?
Вы можете использовать следующее, используя GROUP BY
с HAVING
:
SELECT frequents.shop
FROM frequents LEFT JOIN person ON frequents.name = person.name
GROUP BY frequents.shop
HAVING SUM(person.sex = 'female') = 0 AND SUM(person.sex = 'male') > 0
select Shop from FREQUENTS,PERSON where FREQUENTS.Name = PERSON.Name and PERSON.Sex = 'men'
Если вы хотите исключительно мужчин, то я бы подумал:
SELECT f.shop
FROM frequents f JOIN
person p
ON f.name = p.name
GROUP BY f.shop
HAVING MIN(p.sex) = MAX(p.sex) AND -- all sex values are the same or NULL
COUNT(p.sex) = COUNT(*) AND -- no NULL values
MIN(p.sex) = 'male' -- the value is male
Эта версия не предполагает, что существует только два пола.
select shop
from
(select shop , (case when sex = 'Male' then 1 else 2 end)s_cnt
from frequents a11
join person a12
on a11.name = a12.name
group by shop , (case when sex = 'Male' then 1 else 2 end)
) a11
group by shop
having sum(s_cnt) = 1
Например NOT EXISTS
select distinct shop
from frequents
where not exists (
select 1
from person
where person.name = frequents.name and person.sex = 'female'
)
Однако в соответствии с этим тестом может быть лучше использовать подход IS NULL
:
select distinct shop
from frequents
left join person on person.name = frequents.name and person.sex = 'female'
where person.name is null
Frequents
. Попробуйте сначала, а затем обратитесь за помощью, это не сложный SQL