الانضمام إلى الجداول الأخرى في استعلامات شجرة أوراكل

StackOverflow https://stackoverflow.com/questions/117512

  •  02-07-2019
  •  | 
  •  

سؤال

بالنظر إلى جدول (معرف، وصف) بسيط t1، مثل

id  description
--  -----------
1   Alice
2   Bob
3   Carol
4   David
5   Erica
6   Fred

وجدول العلاقة بين الوالدين والطفل t2، مثل

parent  child
------  -----
1       2
1       3
4       5
5       6

تقدم Oracle طريقة لاجتياز هذا كشجرة مع بعض ملحقات بناء الجملة المخصصة:

select parent, child, sys_connect_by_path(child, '/') as "path"
from t2
connect by prior parent = child

بناء الجملة الدقيق ليس مهمًا، وربما ارتكبت خطأً فيما سبق.الشيء المهم هو أن ما سبق سوف ينتج شيئًا يبدو

parent  child  path
------  -----  ----
1       2      /1/2
1       3      /1/3
4       5      /4/5
4       6      /4/5/6
5       6      /5/6

سؤالي هو هذا:هل من الممكن الانضمام إلى جدول آخر داخل sys_connect_by_path()، مثل الجدول t1 أعلاه، لإنتاج شيء مثل:

parent  child  path
------  -----  ----
1       2      /Alice/Bob
1       3      /Alice/Carol
... and so on...
هل كانت مفيدة؟

المحلول

في الاستعلام الخاص بك، استبدل T2 باستعلام فرعي يربط T1 وT2، ويقوم بإرجاع وصف الأصل والفرع والفرع.ثم في وظيفة sys_connect_by_path، قم بالإشارة إلى الوصف الفرعي من الاستعلام الفرعي الخاص بك.

نصائح أخرى

بناءً على فكرة مايك مكاليستر، يستخدم ما يلي جدولًا مشتقًا لتحقيق النتيجة المرجوة:

select
     T.PARENT
    ,T.CHILD
    ,sys_connect_by_path(T.CDESC, '/')
from
    (
        select
             t2.parent      as PARENT
            ,t2.child       as CHILD
            ,t1.description as CDESC
        from
             t1, t2
        where
            t2.child = t1.id
    ) T
where
    level > 1 and connect_by_isleaf = 1
connect by prior
    T.CHILD = T.PARENT

في مشكلتي، يتم تثبيت جميع الأصول تحت جذر "الوالد الفائق"، مما يعني أنه يمكن وصف المسارات بالكامل باستخدام SYS_CONNECT_BY_PATH، وبالتالي تجنب الحاجة إلى أسلوب cagcowboy لربط الأصل بالمسار.

SELECT parent, child, parents.description||sys_connect_by_path(childs.description, '/') AS "path"
FROM   T1 parents, T1 childs, T2
WHERE  T2.parent = parents.id
AND    T2.child = childs.id
CONNECT BY PRIOR parent = child
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top