In den letzten Tagen arbeite ich an einer Lösung für meine Aufgabe und ich kann einfach keine Antwort finden.Oracle SQL connect_by_root und Unterabfragen
Einführung: Angenommen, wir haben eine einzige Tabelle namens People. Jede Person hat drei Felder: name
, boss
und position
. name
ist ein Primärschlüssel, position
nur eine Zeichenfolge und boss
als Fremdschlüssel verweist auf eine andere Person name
. Es erstellt einen normalen Baum wie Person1 -> Person2 -> Person3 -> Person4, wobei Person4 ein höchster Chef und Person1 die Wurzel ist. Zur Vereinfachung nehmen wir an, dass niemand mehr als 3 Bosse hat, und Person4 ist der Kopf Chef
Beispiel Wege (die einzige Person mit boss
gleich null
.):
Person7 -> Person4
Person6 -> Person8 -> Person4
Person2 -> Person8 -> Person4
So meine Aufgabe sagt: eine Abfrage erstellen, die in hierarchischer ord zeigt er Namen von jedem Vorsprung für jede Person mit position
gleich „Arbeiter“ oder „Manager“ nur Baumoperationen unter Verwendung (eine Verbindung durch, connect_by_root etc.) und Unterabfragen
die Ausgabetabelle von 5 Spalten bestehen muss:
Wenn eine Boss-Spalte null wäre, dann sollte ich einige Leerzeichen einfügen.
Das ist meine Abfrage so weit:
select
case
when l = 1 then name else ' ' end as "Name",
position,
case
when l = 2 then name else ' ' end as "Boss 1",
case
when l = 3 then name else ' ' end as "Boss 2",
case
when l = 4 then name else ' ' end as "Boss 3"
from (
select
connect_by_root position as position,
level as l,
name
from
People
connect by prior
boss = name
start with
position = 'Worker'
or position = 'Manager'
);
es irgendwie funktioniert der Trick, aber jeder Ebene des Baumes ist eine neue Reihe, das ist etwas, was ich vermeiden müssen. Ich weiß, warum diese Abfrage ein Ergebnis wie dieses erzeugt, aber ich habe keine Ahnung, wie ich den Baum durchqueren kann, ohne bei jedem Schritt eine neue Zeile zu erstellen.
Mein Ergebnis:
Name |Position|Boss 1|Boss 2|Boss 3
JOHN WORKER
WORKER HENRY
WORKER PETER
TERRY WORKER
WORKER PETER
ALICE WORKER
WORKER PETER
BILL MANAGER
MANAGER JAMES
MANAGER PETER
Dies ist das Ergebnis, das ich erreichen möchte:
Name |Position|Boss 1|Boss 2|Boss 3
JOHN WORKER HENRY PETER
TERRY WORKER PETER
ALICE WORKER PETER
BILL MANAGER JAMES PETER
Gibt es eine Lösung ohne anspruchsvolle Funktionen wie Pivot mit ihm arbeiten zu machen?
Nur 'max' oder' min' Funktionen. Und ersetze '... name else '' end ...' mit '... name else null end ...' – Dmitry
Diese Funktionen in Unterabfrage? – Karatte