2012-12-01 6 views
5

Kann nun die Daten abrufen, aber ich frage mich, ob es eine bessere Möglichkeit gibt, die Abfrage für große Datenmengen zu optimieren.Hierarchische Abfrage muss Kinder, Eltern und Geschwister ziehen

http://sqlfiddle.com/#!4/0ef0c/5

Also im Grunde möchte ich in der Lage sein, die Abfrage eines gegebenen org ID zu liefern und haben es rekursiv seine Eltern ziehen ihre Kinder, ihre Geschwister und ihre Tanten und Onkel. Ziehen Sie dann alle Aktivitäten, die dieser Organisationshierarchie zugeordnet sind.

Org1 ist die Organisation auf oberster Ebene, aber es darf ein Null-Elternelement haben oder nicht.

Grundsätzlich habe ich eine Abfrage nach oben und unten durchgeführt, um die Kinder und Eltern zu ziehen, aber kann nur scheinen, die Geschwister durch Hinzufügen einer anderen Abfrage zu bekommen. Endlich eine weitere Abfrage mit Hilfe eines Freundes, aber sehr wenig große Datensätze (4-5k Aktivitäten).

Jeder Einblick würde sehr geschätzt werden.

+0

Wenn Sie sich die Mühe gemacht haben, eine Geige zu erstellen, wäre ein Link praktisch. – Laurence

+0

Entschuldigung. http://sqlfiddle.com/#!4/5310d/5/0 –

+0

Ja, es hilft, um klar zu sein. Folglich haben Sie zum dritten Mal neue Informationen zu dem hinzugefügt, was Sie ziehen möchten. Vergiss es. – REW

Antwort

0

Wenn Ihre Organisation. Struktur ist streng hierarchisch, dann können Sie diesen Ansatz verwenden: http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html

Der Nachteil ist, dass Sie den Index bei jeder Aktualisierung der Organisationsstruktur aktualisieren müssen. Jedoch werden Organisationsstrukturen normalerweise viel öfter gelesen und dann modifiziert. Also IMHO sollte das den Trick machen.

0

Der Schlüssel dazu ist im Wort "rekursiv". Erstellen Sie dazu eine Prozedur, die sich selbst aufruft. Dies ist ein Beispiel für Eltern, aber da es einen Cursor verwendet, um durch Einträge zu blättern, sollte es einfach sein, wie man dies verwendet, um Kinder und andere Beziehungen zu finden, die Rekursion beinhalten.

CREATE OR REPLACE PROCEDURE find_parents( 
    org_id NUMBER, 
    lvl NUMBER DEFAULT 1) AS 

    c_parent table1.id%TYPE; 
    c_name table1.name%TYPE; 
    CURSOR c_parents (c_id table1.id%TYPE) IS 
    SELECT parent, name FROM table1 WHERE (id = c_id); 

    BEGIN 
    dbms_output.put('-'); 
    OPEN c_parents(org_id); 
    LOOP 
     FETCH c_parents INTO c_parent, c_name; 
     EXIT WHEN c_parents%notfound; 
     dbms_output.put_line('Level ' || lvl || ' parent: [ID: ' || c_parent || ', NAME: ' || c_name || ']'); 
     find_parents(c_parent, lvl + 1); 
    END LOOP; 
    CLOSE c_parents; 
    END; 
+0

Dies sollte in einer regulären hierarchischen Abfrage möglich sein - keine Prozedur erforderlich. –