الانضمام إلى الجداول الأخرى في استعلامات شجرة أوراكل
-
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