oracle - Oracle 中的家谱查询

标签 oracle hierarchical-data genealogy

我正在尝试从 Oracle 数据库中获取动物谱系树。

这是表格:

Animal
------------------------
Animal_ID
Parent_Male_ID
Parent_Female_ID
....
....
------------------------

如果我指定一种动物,我可以使用如下方式获取其所有后代(在雄性方面):

SELECT *
FROM animal
START WITH animal_id = 123
CONNECT BY PRIOR animal_id = parent_male_id

我正在尝试找到一种方法来扩展它,如果我指定一种动物,它将获取 parent 双方,然后获取其所有后代。

有什么想法吗? (这是Oracle 9.2)

最佳答案

SELECT  *
FROM    animal
START WITH
        animal_id IN
        (
        SELECT  parent_male_id
        FROM    animal
        WHERE   animal_id = 123
        UNION ALL 
        SELECT  parent_female_id
        FROM    animal
        WHERE   animal_id = 123
        )
CONNECT BY
        PRIOR animal_id IN (parent_male_id, parent_female_id)

但是,这个查询会非常慢。

最好使用这个:

SELECT  DISTINCT(animal_id) AS animal_id
FROM    (
        SELECT  0 AS gender, animal_id, father AS parent
        FROM    animal
        UNION ALL
        SELECT  1, animal_id, mother
        FROM    animal
        )
START WITH
        animal_id IN
        (
        SELECT  father
        FROM    animal
        WHERE   animal_id = 9500
        UNION ALL 
        SELECT  mother
        FROM    animal
        WHERE   animal_id = 9500
        )
CONNECT BY
        parent = PRIOR animal_id
ORDER BY
        animal_id

,它将使用HASH JOIN并且速度更快。

有关性能详细信息,请参阅我的博客中的此条目:

关于oracle - Oracle 中的家谱查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/782928/

相关文章:

sql - oracle查询中如何识别主键表和外键表列数据类型和数据长度的差异

php mysql替代在循环内再次使用相同的查询

mysql - 如何创建 MySQL 分层递归查询?

database - 家谱:关联数据库中的家庭关系

Oracle PL/SQL : How to write a loop in order to print all the components of a variable of Oracle customized type?

.net - Oracle.Dataaccess 错误 ORA-06502 : PL/SQL: numeric or value error: character string buffer too small

java - 在java中获取pl/sql数组返回值

r - 标准差之间/之内

genealogy - 近交系数计算和系谱软件

graph-theory - 根据家谱数据计算家庭关系