sql - 在树中查找孩子的父母 -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)
解决方案
只需反转条件:
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
推荐阅读
- python - 在图像上卷积一个小型神经网络?
- javascript - 在继续之前是否可以等待内部的`await`?
- python-3.x - 如何使用 Selenium 获取 CSS 类的文本
- c# - C# BadImageFormatException 仅在一台 PC 上?
- wpf - 用于移动网格内容的 WPF 锚点网格 OpacityMask
- python - 如果在字符串变量中发现多个字符串,则选择第二个特定字符串
- sql - 在 Hive 中将字符串转换为时间戳
- python - 在测试集中使用带有新功能的 Sklearn Pipeline(文本分类)
- php - 如何隐藏未登录用户的店面搜索框?
- asp.net-web-api - 为什么 swagger 会自动添加到我的 webapi 项目中?