Oracle : Ausgabe sortiert anzeigen

AlexD1979

Erfahrenes Mitglied
Hallo,
Ich weiß nicht so ganz, ob das überhaupt möglich ist, aber ich habe eine eine Abfrage, die mir eine Liste mit Lieferanten und deren zugehörigen Niederlassungen zurück liefert.

Code:
SELECT transporter_id AS obj_id,comp_name,street,plz,city,main_office from tdb_transporter

Ausgabe z.B.

Firma X (Hauptsitz)
Firma Y (Niederlassung)
Firma X (Niederlassung 1)
Firma Y Hauptsitz
Firma Z Hauptsitz
Firma Z (Niederlassung 1)
Firma X Niederlassung 2)

Nun ist die Liste ja total unsortiert. Es gibt immer einen Hauptsitz, und der kann x Niederlassungen haben. Wird halt dadurch angezeigt, dass es ein Feld main_office_id gibt, in dem die ID des Hauptsitzes steht.
Wie bekomme ich aber SQL nun dazu, das er mir erst den Hauptdatensatz anzeigt, dann die dazugehörigen Niederlassungen und dann nächsten Hauptdatensatz und wieder die Niederlassungen ...

Ist das überhaupt möäglich?
 
tobiastt hat gesagt.:
Hallo,

hast du es schon mal mit order by probiert? Damit kannst du nach einer Spalte sortieren.

Tobias

Das ist wohl wahr, aber das klappt ja nicht, weil dann alle Hauptstellen oben stehen, da in denen das link_main_office Flag = NULL ist und die Niederlassungen haben dort ja einen Wert > 0
Ich glaube da muss irgendwas mit einem Subselect gemacht werden...
erst alle Hauptstellen selektieren und dann die zugehörigen Niederlassungen oder so ähnlich
 
Wie wärs denn dann mit der Funktion NVL
Code:
SQL> select t.*, nvl(parent, id) from firmen t order by nvl(parent, id), parent desc;

        ID NAME                                                   PARENT NVL(PARENT,ID)
---------- -------------------------------------------------- ---------- --------------
         1 Firma X (Hauptsitz)                                                        1
         7 Firma X Niederlassung 2)                                    1              1
         3 Firma X (Niederlassung 1)                                   1              1
         4 Firma Y Hauptsitz                                                          4
         2 Firma Y (Niederlassung)                                     4              4
         5 Firma Z Hauptsitz                                                          5
         6 Firma Z (Niederlassung 1)                                   5              5

7 rows selected.

Viel schöner, und vor allem professioneller ;-) geht es aber mit hierarchischen Queries:

Code:
  1  SELECT ID, LEVEL, LPAD(' ',3*(LEVEL-1)) || NAME AS FNAME FROM FIRMEN
  2     CONNECT BY PRIOR
  3     ID = PARENT
  4     START WITH PARENT IS NULL
  5*    ORDER SIBLINGS BY NAME

        ID      LEVEL FNAME
---------- ---------- ----------------------------------------
         1          1 Firma X (Hauptsitz)
         3          2    Firma X (Niederlassung 1)
         7          2    Firma X Niederlassung 2)
         4          1 Firma Y Hauptsitz
         2          2    Firma Y (Niederlassung)
         5          1 Firma Z Hauptsitz
         6          2    Firma Z (Niederlassung 1)

7 rows selected.

Die LEVEL Spalte wird dabei automatisch von Oracle mitgeliefert, ist z.B. Ideal um einen Tree zu erzeugen. Mit LPAD habe ich die LEVEL Spalte genutzt um eine Einrückung zu erreichen...
 
Danke, ich werde es mal damit probieren..

Meine Ausgabe sieht so aus im Ur-Zustand:

Code:
 OBJ_ID     COMP_NAME                       STREET                   PLZ     CITY             MAIN_OFFICE     LINK_MAIN_OFFICE    
 ---------  ------------------------------  -----------------------  ------  ---------------  --------------  ------------------- 
 0          Bernd Bruns Spedition GmbH (H)  Niedernstraße 123  31655   Stadthagen       1               (null)              
 1          Bruns Freilassing AG (N)        Lowernman 123            12345   Freilassing      0               0                   
 6          rtrtr                           etert                    23423   ertert           1               (null)              
 7          Testspedition (N)               fegjdfj                  23423   dfgkdfkjlö  0               0                   
 8          zzzjzjkzjkzjk                   ekljfkljdf               90393   skdfskjljkl      0               0
 
Zurück