Har en tabell som ser ut så här
lFolderID (PK)
lParentID (NULL)
sFolderName
Alla root kataloger har lParentID = NULL.
Tabellen kan se ut så här
lFolderId, lParentID, sFoldername
1, NULL, Office
2, NULL, Temp
3, 1, Word
4, 1, Excel
5, 3, Doc
6, 3, Dot
Excel och Word är då under grupper av "Office" och "Dot" och "Doc" är undergrupper av "Word"
Hänger ni med?
Nu vill jag plocka ut i en SQL-sats det som finns Under Katalogen Office. D.v.s Jag vill ha svaret så här...
Word
Dot
Doc
Excel
Någon som har någon aning om detta är möjligt? Och hur gör man i så fall... Känner mig insnöad...
------------------
- Rickard http://cherub.deca-production.net
"You say I'm beautiful. Well, I can't help it! You say I'm empty. We all know I'm full of shit!"
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.
------------------ En eller annan godbit från pannan
Herman: Du har inget exempel eller liknande på detta...?
------------------
- Rickard http://cherub.deca-production.net
"You say I'm beautiful. Well, I can't help it! You say I'm empty. We all know I'm full of shit!"
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...
------------------
- Rickard http://cherub.deca-production.net
"You say I'm beautiful. Well, I can't help it! You say I'm empty. We all know I'm full of shit!"
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.