4

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

4

1 回答 1

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并且速度更快。

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

于 2009-04-23T18:23:37.937 回答