Comment puis-je obtenir une liste distincte d'éléments dans une requête hiérarchique?
-
03-10-2019 - |
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é?
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