2009-08-26 13 views
2

Ich habe eine grundlegende Baumstruktur von Entitäten. Der Baum kann maximal 5 Knoten tief sein, kann aber N Knoten breit sein. Ich habe diese Beziehung in der Tabelle ähnlich abgebildet, was unten dargestellt:Hierarchische SQL-Frage

myID | myDescription | myParentID 

ich mit einem bekannten Objekt am Anfang steht, das einen Start „myID“ zu haben, übersetzen könnte. Jetzt möchte ich alle Kindknoten bekommen. Gibt es eine Möglichkeit, alle untergeordneten Knoten in einer Anweisung zu erhalten? Dies muss die Kinder meiner Kinder einschließen und weiter den Baum hinunter gehen. Ich benutze Oracle SQL.

Danke, Jay

Antwort

4
SELECT * 
FROM mytable 
START WITH 
     myid = :id 
CONNECT BY 
     myparentid = PRIOR myid 
+0

Dies funktioniert nur auf Oracle, richtig? –

+0

@Eric: Korrekt, CONNECT BY ist Oracle nur hierarchische Abfragesyntax. –

+0

'Eric J.': absolut. In 'SQL Server' und' PostgreSQL 8.4' verwenden Sie 'CTE's, für' PostgreSQL 8.3-'und' MySQL' lesen Sie diese Artikel in meinem Blog: http://explainextended.com/2009/05/29/hierarchical -queries-in-postgresql /, http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/ – Quassnoi

0

Ich würde vorschlagen, eine andere Art und Weise mit der Hierarchie zu modellieren, wenn Sie alle Knoten in einer einzigen Abfrage abrufen möchten. Eine sehr gute und gebräuchliche Implementierung ist das nested set Modell. Der Artikel beschreibt, wie dies in MySQL implementiert wird, aber es kann leicht nach Oracle portiert werden.

+0

Es ist ein cooles Modell, aber nicht für gleichzeitige Updates ratsam auf große Datenmenge. Das Hinzufügen eines Blattes könnte alle Datensätze in der Tabelle aktualisieren. ** Wenn Daten selten ändern, ist es ein guter Rat. ** – Christian13467

0

Eine mögliche nette Möglichkeit, dies zu implementieren, ist ein weiteres Feld hinzuzufügen, das den "Pfad" zum Datensatz enthält. Sagen wir, der oberste Datensatz ist ID = 1. Es hat ein Kind mit ID = 5, und es hat wieder ein Kind mit ID = 20, dann würde der letzte Datensatz den Pfad /1/5/20 haben Wenn Sie also alle untergeordneten Knoten Ihres obersten Knotens möchten, tun Sie

select * from MyTable where Path like '/1/%' 

(sorry, sQL Server-Syntax, ich bin kein Orakel Entwickler - aber das Konzept gelten würde noch)

Um Kinder des mittleren Knoten

select * from MyTable where Path like '/1/5/%' 

die ordentliche Sache zu erhalten über Diese Lösung besteht darin, dass Sie Indizes auf das Feld "path" anwenden können Die Anweisung wird nur mit einem einzigen Index-Scan ausgeführt, was sie sehr effizient macht.