¿Cómo puedo obtener una lista distinta de elementos en una consulta jerárquica?
-
03-10-2019 - |
Pregunta
Tengo una tabla de base de datos, con las personas identificadas por un nombre, un trabajo y una ciudad. Tengo una segunda tabla que contiene una representación jerárquica de cada puesto de trabajo en la empresa en cada ciudad.
Supongamos que tengo 3 personas en la mesa de la gente:
[name(PK),title,city]
Jim, Salesman, Houston
Jane, Associate Marketer, Chicago
Bill, Cashier, New York
Y tengo miles de combinaciones de trabajo Tipo / Lugar en la mesa de trabajo, una muestra de que siguen. Se puede ver la relación jerárquica desde PARENT_TITLE es una clave externa a título:
[title,city,pay,parent_title]
Salesman, Houston, $50000, CEO
Cashier, Houston, $25000
CEO, USA, $1000000
Associate Marketer, Chicago, $75000
Senior Marketer, Chicago, $125000
.....
El problema que estoy teniendo es que mi tabla Person es una clave compuesta, por lo que no sé cómo estructurar la parte start with
de mi consulta para que comienza con cada uno de los tres puestos de trabajo en las ciudades que se especifica.
Puedo ejecutar tres consultas separadas para conseguir lo que quiero, pero esto no escala bien. por ejemplo:.
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
¿Qué más puedo obtener una lista distinta (o podría envolverlo con una distinta si no es posible) de todos los puestos de trabajo que están por encima de las tres personas que he especificado?
Solución
Por favor, intente esto. No he probado esto.
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;
Otros consejos
esto debería funcionar:
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