Hallo!

> Ich habe einen Table mit folgender Strukur
>
> [project_id],[parent_project_id]
>
> Dieses erlaubt einen tree zu gestalten.
>
> Nun wie kann ich am schnellsten per SQL diesen tree
> ausgeben lassen?

Da gibt es mehrere M�glichkeiten, aber richtig elegant kann man das nur
mit SQL Server und Stored Procedures l�sen. Hier aber ein "universelles
Beispiel" f�r beliebige Datenbanken mit einem Unterprogramm, das
rekursiv aufgerufen wird:

<%
option explicit

call treeMenu(0, 0)

sub treeMenu(byval pParent, byval pLevel)
   dim rm: set rm = Server.CreateObject("ADODB.Recordset")
   rm.Open "select * from project where parent_project_id = " & pParent,
           db, adOpenStatic, adLockReadOnly, adCmdText
   do while not rm.Eof
      Response.Write(...)
      call treeMenu(rm.Fields("project_id").value, pLevel + 1
      rm.MoveNext
   loop
   rm.Close
end sub
%>

Anstatt direkt auf die Tabelle zuzugreifen, kann man auch eine View
basteln, die noch mehr Informationen zur�ckgibt:

SELECT   *, (SELECT COUNT(*)
             FROM   project AS B
             WHERE  b.parent_project_id = a.project_id) AS children
FROM     project AS A
WHERE    parent_project_id = [P1]
ORDER BY project_id

Hier wird zus�tzlich die Anzahl der "Kinder" ausgegeben, so dass man
sich manchen DB-Aufruf dann sparen kann.

Wenn die Anzahl der Ebenen begrenzt ist, kann man auch direkt ein
hierarchisches Recordset erzeugen lassen.

Ich vermisse bei Dir eine Spalte, in der die Reihenfolge innerhalb einer
Ebene festgelegt wird. Sortierst Du einfach nur nach "project_id" oder
vielleicht gar nicht?

Freundliche Gr��e
Joachim van de Bruck




| [aspdedatabase] als [email protected] subscribed
| http://www.aspgerman.com/archiv/aspdedatabase/ = Listenarchiv
| Sie k�nnen sich unter folgender URL an- und abmelden:
| http://www.aspgerman.com/aspgerman/listen/anmelden/aspdedatabase.asp

Antwort per Email an