Вы понимаете, что это эквивалентно этому:
select *
from (
with target_person as (
select
p.person_id,
p.family_number,
p.relationship_type_id
from
people p
where
p.relationship_type_id = 1 -- parent
)
select
target_person.person_id,
related_person.related_person_id,
related_person.relationship_type_id
from
target_person,
target_person related_person
where
target_person.person_id != related_person.person_id
and target_person.family_number = related_person.family_number
);
Так что это действительно так просто:
SELECT *
FROM people AS l
INNER JOIN people AS r
ON l.family_number = r.family_number
AND l.relationship_type_id = 1
AND r.relationship_type_id = 1
AND l.person_id <> r.person_id
Я бы подумал, что самый быстрый способ сделать это - создать индекс на relationship_type_id
, family_number
, person_id
на вашей таблице сотрудников.