Come posso ottenere una lista distinta di elementi in una query gerarchica?
-
03-10-2019 - |
Domanda
Ho una tabella di database, con le persone identificate da un nome, un lavoro e una città. Ho una seconda tabella che contiene una rappresentazione gerarchica di ogni lavoro in azienda in ogni città.
Supponiamo che io ho 3 persone nella tabella persone:
[name(PK),title,city]
Jim, Salesman, Houston
Jane, Associate Marketer, Chicago
Bill, Cashier, New York
E ho migliaia di posti di lavoro combinazioni tipo / posizione nella tabella di lavoro, un campione di che seguono. Potete vedere il rapporto gerarchico in quanto PARENT_TITLE è una chiave esterna per titolo:
[title,city,pay,parent_title]
Salesman, Houston, $50000, CEO
Cashier, Houston, $25000
CEO, USA, $1000000
Associate Marketer, Chicago, $75000
Senior Marketer, Chicago, $125000
.....
Il problema che sto avendo è che il mio tavolo Persona è una chiave composita, quindi non so come strutturare la parte start with
della mia query in modo che inizia con ciascuno dei tre posti di lavoro nelle città ho specificato.
Posso eseguire tre query separate per ottenere ciò che voglio, ma questo non scala bene. per esempio:.
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
In quale altro modo posso ottenere una lista distinta (o potrei avvolgerlo con una distinta, se non è possibile) di tutti i lavori che sono al di sopra delle tre persone che ho specificato?
Soluzione
Si prega di provare questo. Non ho ancora testato questo.
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;
Altri suggerimenti
questo dovrebbe funzionare:
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