我正在尝试从 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

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

有什么想法吗?(这是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 并且速度更快。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top