Oracle 中的家谱查询
-
13-09-2019 - |
题
我正在尝试从 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
并且速度更快。
有关性能详细信息,请参阅我的博客中的此条目:
不隶属于 StackOverflow