Объединение и агрегация:
select p.person_name
from person p inner join
person_relative pr
on pr.person_id = p.person_id
where pr.relative_name in ('adam', 'carl', 'dave')
group by p.person_name
having count(*) = 3;
Если у одного человека есть дубликаты родственников, используйте distinct
внутри count()
:
having count(distinct pr.relative_name) = 3;
РЕДАКТИРОВАТЬ: После редактирования вопроса
select p.person_name
from person p inner join
person_relative pr
on pr.person_id = p.person_id
group by p.person_name
having sum( pr.relative_name not in ('adam', 'carl', 'dave') ) = 0;