Oracle中的家谱查询

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)

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的效率更高。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接