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?

È stato utile?

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 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top