Question

J'ai une table de base de données, avec des personnes identifiées par un nom, un emploi et une ville. J'ai une deuxième table qui contient une représentation hiérarchique de tous les emplois dans l'entreprise dans toutes les villes.

Supposons que j'ai 3 personnes dans la table personnes:

[name(PK),title,city]
Jim, Salesman, Houston
Jane, Associate Marketer, Chicago
Bill, Cashier, New York

Et j'ai des milliers de combinaisons de type / emplacement emploi dans la table de travail, un échantillon qui suivent. Vous pouvez voir la relation hiérarchique depuis PARENT_TITLE est une clé étrangère à titre:

[title,city,pay,parent_title]
Salesman, Houston, $50000, CEO
Cashier, Houston, $25000
CEO, USA, $1000000
Associate Marketer, Chicago, $75000
Senior Marketer, Chicago, $125000

.....

Le problème que je vais avoir est que ma table personne est une clé composite, donc je ne sais pas comment structurer la partie start with de ma requête afin qu'il commence par chacun des trois emplois dans les villes que je spécifié.

Je peux exécuter trois requêtes distinctes pour obtenir ce que je veux, mais cela n'échelle pas bien. par exemple:.

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

Comment puis-je obtenir une liste distincte (ou je pourrais l'envelopper avec une distincte sinon possible) de tous les emplois qui sont au-dessus des trois personnes que je spécifié?

Était-ce utile?

La solution

S'il vous plaît essayer. Je n'ai pas testé.

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;

Autres conseils

cela devrait fonctionner:

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 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top