首页 > 解决方案 > 在树中查找孩子的父母 -Oracle

问题描述

我有这个示例表(作为分层 SQL 的树)。

我们如何根据孩子找到最根本的父母?

例如:查找“Sally”的父母 - 答案:Chris and Barbara Edsger and Barbara > Grandma

样本数据:

家庭成员 母亲 父亲 嫁给
奶奶 空值 空值 爷爷
爷爷 空值 空值 奶奶
娜娜 空值 空值 爷爷
爷爷 空值 空值 娜娜
埃兹格 奶奶 爷爷 优雅
艾达 奶奶 爷爷 空值
优雅 娜娜 爷爷 埃兹格
艾伦 娜娜 爷爷 空值
克里斯 优雅 埃兹格 伊丽莎白
芭芭拉 优雅 埃兹格 空值
伊丽莎白 空值 空值 克里斯
蒂姆 伊丽莎白 克里斯 空值
莱纳斯 伊丽莎白 克里斯 空值
莎莉 伊丽莎白 克里斯 空值

我编写了这个查询来查找父母的孩子(并且它有效),但我无法编写查询来根据孩子查找父母。

SELECT lpad(' ',level*3,' ') || family_member as who, level
FROM family
start with family_member = 'Grandma'
Connect By Prior family_member IN (MOTHER, FATHER)

标签: sqloracleplsql

解决方案


只需反转条件:

SELECT lpad(' ',level*3,' ') || family_member as who,level
FROM family
START WITH family_member = 'Sally'
Connect By family_member IN (PRIOR mother, PRIOR father)

其中,对于您的示例数据:

CREATE TABLE family (FAMILY_MEMBER, MOTHER, FATHER, MARRIED_TO) AS
SELECT 'Grandma',   null,       null,       'Grandpa' FROM DUAL UNION ALL
SELECT 'Grandpa',   null,       null,       'Grandma' FROM DUAL UNION ALL
SELECT 'Nana',      null,       null,       'Granddad' FROM DUAL UNION ALL
SELECT 'Granddad',  null,       null,       'Nana' FROM DUAL UNION ALL
SELECT 'Edsger',    'Grandma',  'Grandpa',  'Grace' FROM DUAL UNION ALL
SELECT 'Ada',       'Grandma',  'Grandpa',  null FROM DUAL UNION ALL
SELECT 'Grace',     'Nana',     'Granddad',     'Edsger' FROM DUAL UNION ALL
SELECT 'Alan',      'Nana',     'Granddad',     null FROM DUAL UNION ALL
SELECT 'Chris',     'Grace',    'Edsger',   'Elizabeth' FROM DUAL UNION ALL
SELECT 'Barbara',   'Grace',    'Edsger',   null FROM DUAL UNION ALL
SELECT 'Elizabeth',     null,       null,       'Chris' FROM DUAL UNION ALL
SELECT 'Tim',       'Elizabeth',    'Chris',    null FROM DUAL UNION ALL
SELECT 'Linus',     'Elizabeth',    'Chris',    null FROM DUAL UNION ALL
SELECT 'Sally',     'Elizabeth',    'Chris',    null FROM DUAL;

输出:

WHO 等级
Sally 1
Chris 2
Edsger 3
Grandma 4
Grandpa 4
Grace 3
Nana 4
Granddad 4
Elizabeth 2

推荐阅读