كيف يمكنني الحصول على قائمة مميزة من العناصر في استعلام هرمي؟

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

سؤال

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

لنفترض أن لدي 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 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top