سؤال

أحاول جلب شجرة حيوانات الأنساب من قاعدة بيانات أوراكل الخاصة بي.

إليك الجدول:

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