我有以下数据集,可以重新组装家谱树。
祖先 | 家长 | 级别 | 孩子 | 头发颜色 | 树 |
---|---|---|---|---|---|
托尼 | 1 | 棕色 | 托尼 | ||
托尼 | 托尼 | 2 | 玛丽 | 棕色 | 托尼 - 玛丽 |
托尼 | 托尼 | 2 | 约翰 | 黑色 | 托尼 - 约翰 |
托尼 | 玛丽 | 3 | 凯蒂 | 棕色 | 托尼 - 玛丽 - 凯蒂 |
托尼 | 玛丽 | 3 | 杰夫 | 黑色 | 托尼 - 玛丽 - 杰夫 |
托尼 | 约翰 | 3 | 迈克 | 棕色 | 托尼 - 约翰 - 迈克 |
托尼 | 约翰 | 3 | 埃文 | 棕色 | 托尼 - 约翰 - 埃文 |
托尼 | 凯蒂 | 4 | 卢卡 | 棕色 | 托尼 - 玛丽 - 凯蒂 - 卢卡 |
托尼 | 凯蒂 | 4 | 伊斯拉 | 黑色 | 托尼 - 玛丽 - 杰夫 - 艾拉 |
托尼 | 埃文 | 4 | 芬恩 | 黑色 | 托尼 - 约翰 - 埃文 - 芬恩 |
我想从祖先托尼开始搜索每个家族,并返回第一个头发颜色为黑色的孩子。
祖先 | 家长 | 级别 | 孩子 | 头发颜色 | 树 |
---|---|---|---|---|---|
托尼 | 托尼 | 2 | 约翰 | 黑色 | 托尼 - 约翰 |
托尼 | 玛丽 | 3 | 杰夫 | 黑色 | 托尼 - 玛丽 - 杰夫 |
托尼 | 凯蒂 | 4 | 伊斯拉 | 黑色 | 托尼 - 玛丽 - 杰夫 - 艾拉 |
为了实现这一目标,我尝试使用 not in 和 is like 来创建一个由祖先、父级和级别(对于 Black 头发颜色)组成的键,并将它们从数据集中排除,但它不起作用(我无法将两者合并在同一个子查询中)。
如果有任何其他想法来解决这个问题,我将不胜感激。
您可以使用分层查询:
SELECT parent,
child,
hair_color,
SUBSTR(SYS_CONNECT_BY_PATH(child, ' - '), 4) AS tree
FROM table_name
WHERE hair_color = 'Black'
START WITH parent IS NULL
CONNECT BY
PRIOR child = parent
AND PRIOR hair_color <> 'Black';
对于样本数据:
CREATE TABLE table_name (parent, child, hair_color) AS
SELECT NULL, 'Tony', 'Brown' FROM DUAL UNION ALL
SELECT 'Tony', 'Mary', 'Brown' FROM DUAL UNION ALL
SELECT 'Tony', 'John', 'Black' FROM DUAL UNION ALL
SELECT 'Mary', 'Katy', 'Brown' FROM DUAL UNION ALL
SELECT 'Mary', 'Jeff', 'Black' FROM DUAL UNION ALL
SELECT 'John', 'Mike', 'Brown' FROM DUAL UNION ALL
SELECT 'John', 'Evan', 'Brown' FROM DUAL UNION ALL
SELECT 'Katy', 'Luca', 'Brown' FROM DUAL UNION ALL
SELECT 'Katy', 'Isla', 'Black' FROM DUAL UNION ALL
SELECT 'Evan', 'Finn', 'Black' FROM DUAL;
输出:
家长 | 孩子 | 头发颜色 | 树 |
---|---|---|---|
托尼 | 约翰 | 黑色 | 托尼 - 约翰 |
玛丽 | 杰夫 | 黑色 | 托尼 - 玛丽 - 杰夫 |
凯蒂 | 伊斯拉 | 黑色 | 托尼 - 玛丽 - 凯蒂 - 艾拉 |