【问题标题】:Genealogy Query in OracleOracle 中的族谱查询
【发布时间】:2009-04-23 18:21:08
【问题描述】:

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

【问题讨论】:

    标签: oracle hierarchical-data genealogy


    【解决方案1】:
    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,并且速度更快。

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

    【讨论】:

      猜你喜欢
      • 2015-09-25
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 2014-11-23
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多