2017-11-01 1 views
-4

ich auf einer Oracle-Abfrage arbeite, die unter Daten hat:Mitarbeiterhierarchie in Oracle mit Beziehung fehlt

Emp Designation reporter 
A Director  
B Manager  A 
C Supervisor B 
F Supervisor A 
G Director  
H Emp   B 
P Supervisor B 
Q Manager  G 

Die Hierarchie ist: Director -Manager Betreuer Emp

In der obigen Tabelle, wir haben eine Beziehung verloren. z. Im vierten Datensatz fehlt Manager, "F" (Supervisor) meldet direkt "A" (Direktor) Im sechsten Datensatz fehlt Supervisor, "H" (Emp) meldet direkt an "B" (Manager) ich versuche, die oracle-Abfrage erstellen unten Ergebnisse zu erhalten:

Director Manager Supervisor Emp 
A   B  C 
A      F 
G   Q  
A   B     H 
      B  P 



select a.emp Director, b.emp Supervisor , c.emp manager, d.emp emp 
from 
hr_test a 
left join hr_test b 
on a.emp = b.reporter 
left join 
hr_test c 
on b.emp = c.reporter 
left join 
hr_test d 
on c.emp = d.reporter 
where a.DESIGNATION = 'Director' 

Aber mit der obigen Abfrage, ich bin nicht die fehlende Beziehung zu bekommen.

Ich werde wirklich schätzen, wenn mir jemand dabei helfen wird. Vielen Dank im Voraus.

+0

Ich verstehe die downvotes hier nicht. Warum muss man die Frage ablehnen, wenn die OP Mühe beim Schreiben einer Anfrage gezeigt hat? . Ja, die Tischgestaltung könnte schlecht sein. Es ist jedoch nicht immer die Schuld des Benutzers. nicht wahr? –

Antwort

0

SQL Fiddle

Oracle 11g R2 Schema Einrichtung:

CREATE TABLE hr_test (Emp, Designation, reporter) AS 
SELECT 'A', 'Director', NULL FROM DUAL UNION ALL 
SELECT 'B', 'Manager',  'A' FROM DUAL UNION ALL 
SELECT 'C', 'Supervisor', 'B' FROM DUAL UNION ALL 
SELECT 'F', 'Supervisor', 'A' FROM DUAL UNION ALL 
SELECT 'G', 'Director', NULL FROM DUAL UNION ALL 
SELECT 'H', 'Emp',   'B' FROM DUAL UNION ALL 
SELECT 'P', 'Supervisor', 'B' FROM DUAL UNION ALL 
SELECT 'Q', 'Manager',  'G' FROM DUAL; 

Abfrage 1:

SELECT Director, 
     Manager, 
     Supervisor, 
     Emp 
FROM (
    SELECT CONNECT_BY_ROOT(Emp) AS root, 
     Designation, 
     Emp 
    FROM hr_test t 
    START WITH emp NOT IN (SELECT reporter FROM hr_test WHERE reporter IS NOT NULL) 
    CONNECT BY PRIOR reporter = emp 
) 
PIVOT (MAX(Emp) FOR Designation IN (
    'Director' AS DIRECTOR, 
    'Manager' AS MANAGER, 
    'Supervisor' AS SUPERVISOR, 
    'Emp'  AS EMP 
) 
) 

Results:

| DIRECTOR | MANAGER | SUPERVISOR | EMP | 
|----------|---------|------------|--------| 
|  A |  B |  (null) |  H | 
|  A |  B |   P | (null) | 
|  G |  Q |  (null) | (null) | 
|  A |  B |   C | (null) | 
|  A | (null) |   F | (null) | 
+0

Es funktioniert wie erwartet. Danke vielmals :) – Poonam