Wie kann ich eine bestimmte Liste von Elementen in einer hierarchischen Abfrage erhalten?
-
03-10-2019 - |
Frage
ich eine Datenbanktabelle haben, mit Menschen durch einen Namen identifiziert, einen Job und eine Stadt. Ich habe eine zweite Tabelle, die in jeder Stadt eine hierarchische Darstellung eines jeden Jobs in der Firma enthält.
Angenommen, ich habe 3 Personen in den Personen-Tabelle:
[name(PK),title,city]
Jim, Salesman, Houston
Jane, Associate Marketer, Chicago
Bill, Cashier, New York
Und ich habe Tausende von Auftragsart / Standort-Kombinationen in der Jobtabelle, von dem eine Probe folgen. Sie können die hierarchische Beziehung sehen, da PARENT_TITLE ein Fremdschlüssel für Titel lautet:
[title,city,pay,parent_title]
Salesman, Houston, $50000, CEO
Cashier, Houston, $25000
CEO, USA, $1000000
Associate Marketer, Chicago, $75000
Senior Marketer, Chicago, $125000
.....
Das Problem, das ich habe, ist, dass meine Person Tabelle ein Verbundschlüssel ist, so dass ich weiß nicht, wie der start with
Teil meiner Abfrage so strukturieren, dass sie mit jedem der drei Arbeitsplätzen in den Städten beginnen I angegeben.
kann ich drei getrennte Abfragen ausführen zu bekommen, was ich will, aber dies nicht gut skalieren. z.
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
Wie kann ich sonst noch eine deutliche Liste bekommen (oder ich könnte es wickeln mit einem deutlichen, wenn nicht möglich) aller Arbeitsplätze, die über den drei Menschen, die ich angegeben?
Lösung
Bitte versuchen Sie dies. Ich habe nicht getestet.
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;
Andere Tipps
Dies sollte funktionieren:
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