Как я могу получить отчетливый список элементов в иерархическом запросе?
-
03-10-2019 - |
Вопрос
У меня есть таблица базы данных, с людьми, идентифицированными именем, работой и городом. У меня есть вторая таблица, которая содержит иерархическое представление каждой работы в компании в каждом городе.
Предположим, у меня есть 3 человека в народном столе:
[name(PK),title,city]
Jim, Salesman, Houston
Jane, Associate Marketer, Chicago
Bill, Cashier, New York
И у меня есть тысячи комбинаций рабочих мест / местоположения в таблице заданий, образец которого следуют. Вы можете увидеть иерархические отношения, поскольку Parent_Title является внешним ключом к названию:
[title,city,pay,parent_title]
Salesman, Houston, $50000, CEO
Cashier, Houston, $25000
CEO, USA, $1000000
Associate Marketer, Chicago, $75000
Senior Marketer, Chicago, $125000
.....
Проблема у меня есть в том, что настольная таблица моего лица является композитным ключом, поэтому я не знаю, как структурировать start with
Часть моего запроса, так что она начинается с каждой из трех рабочих мест в городах, которые я указал.
Я могу выполнить три отдельных запроса, чтобы получить то, что я хочу, но это не масштабируется хорошо. например:
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
Как еще я могу получить отчетливый список (или я мог бы обернуть его отчетливым, если это невозможно) всех заданий, которые находятся выше трех человек, которые я указывал?
Решение
Пожалуйста, попробуйте это. Я не проверил это.
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;
Другие советы
Это должно работать:
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