Använder du MS SQL server kan du skriva en lagrad procedur med cursors för att hantera rekursivitet tämligen effektivt. Dock har jag för mig att det finns en intern begränsning på 32 nivåer. Cacha gärna resultatet.
Det börjar känns lite som att man kanske skulle begräns antalet nivåer lite... jag har ju faktiskt inget behov av obegrännsat antal nivåer. 3-5 st skulle nog räcka gott...
SELECT F5.SFolderName,
F1.SFolderName + '/' + F2.SFolderName + '/' + F3.SFolderName
+ '/' + F4.SFolderName + '/' + F4.SFolderName, 5
FROM Folders F5, Folders F4, Folders F3, Folders F2,
Folders F1
WHERE F5.IParentID = F4.IFolderID AND
F4.IParentID = F3.IFolderID AND
F3.IParentID = F2.IFolderID AND
F2.IParentID = F1.IFolderID AND F1.IParentID IS NULL AND
F1.IFolderID = [b]1[/b]
UNION
SELECT F4.SFolderName,
F1.SFolderName + '/' + F2.SFolderName + '/' + F3.SFolderName
+ '/' + F4.SFolderName, 4
FROM Folders F4, Folders F3, Folders F2, Folders F1
WHERE F4.IParentID = F3.IFolderID AND
F3.IParentID = F2.IFolderID AND
F2.IParentID = F1.IFolderID AND F1.IParentID IS NULL AND
F1.IFolderID = [b]1[/b]
UNION
SELECT F3.SFolderName,
F1.SFolderName + '/' + F2.SFolderName + '/' + F3.SFolderName,
3
FROM Folders F3, Folders F2, Folders F1
WHERE F3.IParentID = F2.IFolderID AND
F2.IParentID = F1.IFolderID AND F1.IParentID IS NULL AND
F1.IFolderID = [b]1[/b]
UNION
SELECT F2.SFolderName,
F1.SFolderName + '/' + F2.SFolderName, 2
FROM Folders F2, Folders F1
WHERE F2.IParentID = F1.IFolderID AND F1.IParentID IS NULL AND
F1.IFolderID = [b]1[/b]
ORDER BY 2
Där ettan i fetstil är ID:t (parametern) på katalogen för vilken du vill ha underkatalogerna.
Sorteringsordningen är löst via lite fusk, som inte funkar vattentätt (den kan göra det om man använder IFolderID i stället för SFolderName, för att bygga sorteringskolumnen), men principen var det viktiga här.
[r]Kunde visst glömma fetstil inom perl-taggen, men du förstår nog[/r]
[r2]Fetstil funkade visst. Emission är blind.[/r2]
Dock har jag för mig att det finns en intern begränsning på 32 nivåer
Jag har ingen möjlighet att testa, men jag funderar på hur SQL-servern mäter rekursionsnivån. Om den räknar antalet körningar av en procedure inom en transaktion, eller om den helt enkelt stegar upp med ett, om proceduren anreopar sig själv. I så fall så skulle man kanske kunna gå förbi spärren genom att klona proceduren och låta klonerna anropa varandra.....
I övrigt skulle man nog kunna lösa sådant här mha Data Shaping. Inte för att det stöder rekursion, men man skulle kunna få flådiga hierarkiska recordset.