Frage

ich eine Datenbanktabelle haben, mit Menschen durch einen Namen identifiziert, einen Job und eine Stadt. Ich habe eine zweite Tabelle, die in jeder Stadt eine hierarchische Darstellung eines jeden Jobs in der Firma enthält.

Angenommen, ich habe 3 Personen in den Personen-Tabelle:

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

Und ich habe Tausende von Auftragsart / Standort-Kombinationen in der Jobtabelle, von dem eine Probe folgen. Sie können die hierarchische Beziehung sehen, da PARENT_TITLE ein Fremdschlüssel für Titel lautet:

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

.....

Das Problem, das ich habe, ist, dass meine Person Tabelle ein Verbundschlüssel ist, so dass ich weiß nicht, wie der start with Teil meiner Abfrage so strukturieren, dass sie mit jedem der drei Arbeitsplätzen in den Städten beginnen I angegeben.

kann ich drei getrennte Abfragen ausführen zu bekommen, was ich will, aber dies nicht gut skalieren. z.

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

Wie kann ich sonst noch eine deutliche Liste bekommen (oder ich könnte es wickeln mit einem deutlichen, wenn nicht möglich) aller Arbeitsplätze, die über den drei Menschen, die ich angegeben?

War es hilfreich?

Lösung

Bitte versuchen Sie dies. Ich habe nicht getestet.

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;

Andere Tipps

Dies sollte funktionieren:

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 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top