كيف يمكنني الحصول على قائمة مميزة من العناصر في استعلام هرمي؟
-
03-10-2019 - |
سؤال
لدي جدول قاعدة بيانات ، مع الأشخاص الذين تم تحديدهم بواسطة اسم ووظيفة ومدينة. لدي طاولة ثانية تحتوي على تمثيل هرمي لكل وظيفة في الشركة في كل مدينة.
لنفترض أن لدي 3 أشخاص في طاولة الناس:
[name(PK),title,city]
Jim, Salesman, Houston
Jane, Associate Marketer, Chicago
Bill, Cashier, New York
ولدي الآلاف من مجموعات نوع الوظيفة/الموقع في جدول الوظائف ، والتي تتبع عينة منها. يمكنك رؤية العلاقة الهرمية لأن Parent_Title هي مفتاح خارجي للعنوان:
[title,city,pay,parent_title]
Salesman, Houston, $50000, CEO
Cashier, Houston, $25000
CEO, USA, $1000000
Associate Marketer, Chicago, $75000
Senior Marketer, Chicago, $125000
.....
المشكلة التي أواجهها هي أن جدول شخصي هو مفتاح مركب ، لذلك لا أعرف كيفية تنظيم start with
جزء من استفساري بحيث يبدأ بكل وظيفة من الوظائف الثلاث في المدن التي حددتها.
يمكنني تنفيذ ثلاثة استفسارات منفصلة للحصول على ما أريد ، لكن هذا لا يتوسع جيدًا. على سبيل المثال:
select * from jobs
start with city = (select city from people where name = 'Bill') and title = (select title from people where name = 'Bill')
connect by prior parent_title = title
UNION
select * from jobs
start with city = (select city from people where name = 'Jim') and title = (select title from people where name = 'Jim')
connect by prior parent_title = title
UNION
select * from jobs
start with city = (select city from people where name = 'Jane') and title = (select title from people where name = 'Jane')
connect by prior parent_title = title
وإلا كيف يمكنني الحصول على قائمة متميزة (أو يمكنني أن ألتقطها مع مجموعة متميزة إن لم يكن ممكنًا) لجميع الوظائف التي تقع فوق الأشخاص الثلاثة الذين حددتهم؟
المحلول
الرجاء جرب هذا. لم أختبر هذا.
SELECT distinct *
FROM jobs
START WITH ( city, title ) IN
( SELECT city, title
FROM people
WHERE name IN ( 'Bill', 'Jim', 'Jane' )
)
CONNECT BY PRIOR parent_title = title;
نصائح أخرى
هذا يجب أن يعمل:
SQL> SELECT *
2 FROM jobs
3 START WITH (title, city) IN (SELECT title, city FROM people)
4 CONNECT BY PRIOR parent_title = title;
TITLE CITY PAY PARENT_TITLE
------------------ ------- ---------- ------------
Associate Marketer Chicago 7500
Salesman Houston 5000 CEO
CEO USA 100000