您的数据高度非规范化。
简单地决定你将使用哪种关系并忽略另一个。
示例 - 仅限于 母亲 关系显示所有三个相关人员(IDs 已简化)
select * from tab
where relationship = 'MOTHR';
PERSON_1 PERSON_2 RELAT
---------- ---------- -----
224 218 MOTHR
224 217 MOTHR
如果您想要从最年长到最年轻的输出排序使用分层查询(我在数据中添加了两个新人)
WITH t1(person_1, person_2, lvl) AS (
SELECT person_1,
person_2,
1 lvl
FROM tab
WHERE person_1 In (select person_1 from tab where relationship = 'MOTHR'
minus
select person_2 from tab where relationship = 'MOTHR')
and relationship = 'MOTHR'
UNION ALL
SELECT t2.person_1,
t2.person_2,
t1.lvl + 1 lvl
FROM tab t2, t1
WHERE t2.person_1 = t1.person_2 and relationship = 'MOTHR'
)
SEARCH DEPTH FIRST BY person_1 SET order1
SELECT person_1,
person_2,
lvl
FROM t1
order by order1;
PERSON_1 PERSON_2 LVL
---------- ---------- ----------
224 217 1
224 218 1
218 222 2
222 223 3
LVL 列显示世代,即祖母 (1)、母亲 (2) 和女儿 (3)。
要获得最高级别的母亲,您可以在锚部分中使用MINUS 查询:
(select person_1 from tab where relationship = 'MOTHR'
minus
select person_2 from tab where relationship = 'MOTHR')
这会选择所有不是女儿的母亲,这是你需要的。