cherubMedlem sedan apr. 200171 inlägg Yo!
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!"
LarsGMedlem sedan dec. 200012 464 inlägg SQL92 är ju inte så bra på detta. Här finns en artikel. (Det finns några syntaxfel i den psmkod som står där.)
http://www.intelligententerprise.com/001020/celko.shtml
Annars kan man bygga något rekursivt som bygger nya frågor dynamiskt, blir inte så effektivt.
(I sql99 finns det rekursiva queries, som skulle passa utmärkt för detta. Så vitt jag vet så är det bara DB2 som har implementerat det.)
------------------
essentitia preter non sans multiplicandum
HermanMedlem sedan maj 2001431 inlägg 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
cherubMedlem sedan apr. 200171 inlägg 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!"
LarsGMedlem sedan dec. 200012 464 inlägg http://www.sqlteam.com/item.asp?ItemID=1602
------------------
essentitia preter non sans multiplicandum
emissionMedlem sedan dec. 19996 721 inlägg Om man kan sätta en hyfsat låg maxnivå på antal undernivåer, så kan man lösa det med en relativt enkel SQL-sats.
[r]ångrade mig. No probs[/r]
[Redigerat av emission den 16 aug 2001]
cherubMedlem sedan apr. 200171 inlägg 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!"
emissionMedlem sedan dec. 19996 721 inlägg 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]
[Redigerat av emission den 16 aug 2001]
emissionMedlem sedan dec. 19996 721 inlägg 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.
LarsGMedlem sedan dec. 200012 464 inlägg Jo, begränsningen gäller alla anrop, inte bara rekursiva. Det är alltså storleken på call-stacken som är 32.
------------------
essentitia preter non sans multiplicandum