"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Solved: Hirachische Abfrage in SQL - Wie sortieren?

__Luki__ 02.10.2008 - 17:27 3188 10
Posts

__Luki__

bierernst
Avatar
Registered: Nov 2003
Location: gradec
Posts: 2960
Irgendwie komm' ich da nicht ganz dahinter...

Ich habe folgende Abfrage:

Code:
SELECT lpad(last_name, 2*(level-1)+length(last_name), '_') AS Name
FROM employees
START WITH employee_id=100
CONNECT BY PRIOR employee_id = manager_id
[color=red]ORDER BY level, last_name[/color]

Das Problem:
Die Abfrage ohne die ORDER BY-Klausel funktioniert eigentlich wie gewollt, also die Hirachie wird richtig widergeben, jedoch sind die 'Untergebenen' leider nicht alphabetisch geordnet, aber genau das moechte ich gerne haben.

Brr, ich glaub' ich wuerd' das so auch nicht verstehen, also Screenshots: (:D)

Also, ohne ORDER-Klausel:
click to enlarge


Mit ORDER-Klausel:
click to enlarge

Wie ihr seht, wird so meine Hirachie zerstoert...
Wie loese ich das richtig?

Herzlichen Dank,
Luki
Bearbeitet von __Luki__ am 03.10.2008, 09:36

jives

And the science gets done
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
Ich nehme an die Underlines stehen im Namen (?).
Wenn das so ist könntest du den Namen normal (ohne Underlines) abspeichern und eine neue Spalte in deine Tabelle einfügen, in der die Ebene als Zahl festgehalten wird.
Dann brauchst du nur entsprechend viele Underlines oder Trennzeichen oder was auch immer du willst ausgeben und kannst die Namen trotzdem noch alphabetisch ordnen (und zusätzlich noch nach Ebene, wenn nötig).

Edit: WLKIKIV!
Ich hab den Codeschnippsel komplett übersehen :rolleyes:
Wäre es möglich den Code für den Output der Underlines in die aufrufende Applikation zu legen?

Edit 2:
Eigentlich tuts doch eh genau was es soll? Es wird nach Level UND Name geordnet. Wenn du NUR nach dem Namen ordnen willst, kannst du ja das level aus dem ORDER BY rausnehmen.
Bearbeitet von jives am 02.10.2008, 18:48

ica

hmm
Avatar
Registered: Jul 2002
Location: Graz
Posts: 9802
zwar nicht direkt eine lösung, aber falls möglich schau dir nested sets mal an.

http://de.wikipedia.org/wiki/Nested_Sets
http://www.klempert.de/nested_sets/

__Luki__

bierernst
Avatar
Registered: Nov 2003
Location: gradec
Posts: 2960
@ica: Ich arbeite mit Oracle; Habe jetzt ein wenig gegoogled, und es scheint, als wuerden die Nestend Sets in Oracle eben ueber das CONNECT BY realisiert werden...

@jives: Nein, es funktioniert nicht richtig. :)
Die Unterstriche sollen lediglich dazu dienen den Baum anzuzeigen.

King ist auf Ebene 0. => Big Boss.
Ebene 1: (Direkt King unterstellt, ein Unterstrich):
Kochhar, De Haan,

Kochhars Untergebene (Unter ihm, mit 2x Unterstrich) sind: Greenberg, Whalen, Mavris, Baer, etc.

Und zwar genau in dieser Reihenfolge: Greenberg, Whalen, Mavris, Baer... sprich _nicht_ alphabetisch. Ich haette gerne, dass die Hirachie stimmt, jedoch alphabetisch sortiert.

Ich hoffe, ich habe mich klar ausgedrueckt :/
Lg
Luki

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4259
es kommt nicht das raus, was du willst, aber das was du mittels SQL verlangst. du sortierst es nach level. daher kommen zuerst alle mit lvl 1, dann alle mit lvl2, usw.

im grunde willst du so was wie ein menü mit submenüs. vielleicht findest du so ein SQL-Konstrukt, das das bietet.

was spricht dagegen, das außerhalb von SQL zu machen?
Bearbeitet von kleinerChemiker am 02.10.2008, 19:58

__Luki__

bierernst
Avatar
Registered: Nov 2003
Location: gradec
Posts: 2960
Mir ist schon klar, dass SQL das tut, was ich ihm da oben anschaffe, ich weisz auch, dass das ORDER BY falsch ist, und veraendert gehoert, oder durch etwas anderes ersetzt, nur habe ich leider keinen Plan wie.

ad "Wer der Chef von wem ist":
Oja, doch. Durch die Manager-ID.

Jeder Employee, auszer King (Er ist Big Boss ;)) hat eine ManagerID, welche festlegt, wer der Vorgesetzte ist.

zB: Mitarbeiter A hat ManagerID 100 => Employee mit der EmployeeID 100 ist der Vorgesetzte von Mitarbeiter A.

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4259
hab ich eh schon rauseditiert. aber wie gesagt, warum nicht in der anwendung und nicht in sql lösen?

ica

hmm
Avatar
Registered: Jul 2002
Location: Graz
Posts: 9802
Zitat von __Luki__
@ica: Ich arbeite mit Oracle; Habe jetzt ein wenig gegoogled, und es scheint, als wuerden die Nestend Sets in Oracle eben ueber das CONNECT BY realisiert werden...

ah, sorry - so genau hab ichs mir gar nicht angesehen, dass ich das bemerkt hätte :)

aber hab kurz gegoogled, evtl. sowas: ORDER SIBLINGS BY last_name;

http://www.psoug.org/reference/connectby.html

oder zumindest in die richtung...wirds sicher was oracle internes geben. mit normalen sql funktionen gehts imho nicht.

__Luki__

bierernst
Avatar
Registered: Nov 2003
Location: gradec
Posts: 2960
Genau das ist es!

Herzlichen Dank! :D

jives

And the science gets done
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
Aus Interesse (und weil ich nicht weiß ob ich kapiert hab was du willst): Könntest du vielleicht ein Bild vom funktionierenden Output machen?

__Luki__

bierernst
Avatar
Registered: Nov 2003
Location: gradec
Posts: 2960
Gern ;)

click to enlarge
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz