Παραθέτω ένα πρόχειρο script που έχω από τα παλιά... Κατά πάσα πιθανότητα δεν θα είναι optimized και οι SQL guru θα έχουν καλύτερες λύσεις να δώσουν, αλλά είναι ότι πιο πρόχειρο έχω
![Smile [:)]](/cs/emoticons/emotion-1.gif)
. Αποτελείται από δύο sp, τις οποίες παραθέτω. Να σημειώσω ότι προϋποθέτει την ύπαρξη ενός πίνακα Nodes που έχει ως πεδία το nId (node ID), το nPid (node Parent ID) και το nName. Η κλήση γίνεται προς την getDescendants με το ID του κόμβου του δέντρου από τον οποίο ξεκινάς την αναδρομή, η οποία καλεί τελικά την findChildren. Δεν υπάρχει αναδρομή, αλλά γίνεται επανάληψη με
While.
CREATE PROCEDURE getDescendants(@nStartNodeId int) AS
Create Table #temp ( intID int, nLevel int )
Insert Into #temp (intID, nLevel) EXECUTE findChildren @nStartNodeId
Select nId , nName, nLevel as level from #temp , Nodes
Where Nodes.nId = #temp.intID
CREATE PROCEDURE findChildren(@intID int) AS
Declare @nLevel int
Set @nLevel = 1
Declare @bitContinue bit
Set @bitContinue = 1
Create Table #temp ( intID int, nLevel int )
Insert Into #temp( intID, nLevel )
Values (@intID , 0 )
While @bitContinue = 1
Begin
Insert Into #temp (intID , nLevel )
Select a.nId , @nLevel
From Nodes a
Where Exists ( Select null From #temp b Where a.npid = b.intID and b.nLevel = @nLevel - 1 )
If @@RowCount <> 0
SET @nLevel = @nLevel + 1
Else
SET @bitContinue = 0
End
Select * from #temp
Στερνή μου γνώση να σε είχα πρώτα...