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?

¿Fue útil?

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 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top