Stel ik heb een tabel waarin een aantal landen, provincies, plaatsen, stadsdelen, etc. instaan. Het aantal niveau's is niet van te voren bekend, en kan onbeperkt zijn.
Deze tabel heet Regions en ziet er ongeveer zo uit:
Regions
- RegionId
- Name
- ParentId
Waarbij ParentId dus naar het RegionId van de ouder region verwijst. Als dat 0 is, dan gaat het om een root item.
Hiermee is dus een boom te maken die er ongeveer zo uit ziet:
Dit levert geen enkel probleem op
, maar wat wel een probleem oplevert is het queriën van deze data. Stel bijvoorbeeld dat ik wil zoeken naar alle regio's die met 'Am' beginnen. Het resultaat moet nu Amsterdam, Noord, Zuid, Amersfoort en Nogwat zijn.
Maar hoe kan ik zo'n query opbouwen
Nu doe ik het heel omslachtig door at run-time de diepte van de boom te bepalen en dan een hele ingewikkelde SQL string samen te stellen met allerlei "IN (SELECT ...) OR IN (SELECT ...) ... " contrsucties. Dit is zeer onduideliljk en moeilijk te onderhouden.
Ik zat eraan te denken om een veld Parentage toe te voegen waarin dan de hierarchische string staat die aangeeft waar de region in de tree zit, dus bv. "1.12.245".
Dan wordt het probleem al makkelijker door eerst "SELECT Parentage FROM Regions WHERE Name LIKE 'Am%'" te doen, en dan in een loopje een nieuwe query op te bouwen die er uitziet als "SELECT * FROM Regions WHERE Parentage LIKE '{parentage van region 1}%' OR Parentage LIKE '{parentage van region 1}%' OR etc.."
Maar dan nog kan het niet in één query
.
Nu is m'n vraag heel simpel
: Kán het in één query, en zo ja, hoe?
Deze tabel heet Regions en ziet er ongeveer zo uit:
Regions
- RegionId
- Name
- ParentId
Waarbij ParentId dus naar het RegionId van de ouder region verwijst. Als dat 0 is, dan gaat het om een root item.
Hiermee is dus een boom te maken die er ongeveer zo uit ziet:
code:
1
2
3
4
5
6
7
8
9
| Nederland | Noord Holland | | Amsterdam | | | Noord | | | Zuid | Utrecht | | Amersfoort | | | Nogwat | | Etcetera |
Dit levert geen enkel probleem op
Maar hoe kan ik zo'n query opbouwen
Nu doe ik het heel omslachtig door at run-time de diepte van de boom te bepalen en dan een hele ingewikkelde SQL string samen te stellen met allerlei "IN (SELECT ...) OR IN (SELECT ...) ... " contrsucties. Dit is zeer onduideliljk en moeilijk te onderhouden.
Ik zat eraan te denken om een veld Parentage toe te voegen waarin dan de hierarchische string staat die aangeeft waar de region in de tree zit, dus bv. "1.12.245".
Dan wordt het probleem al makkelijker door eerst "SELECT Parentage FROM Regions WHERE Name LIKE 'Am%'" te doen, en dan in een loopje een nieuwe query op te bouwen die er uitziet als "SELECT * FROM Regions WHERE Parentage LIKE '{parentage van region 1}%' OR Parentage LIKE '{parentage van region 1}%' OR etc.."
Maar dan nog kan het niet in één query
Nu is m'n vraag heel simpel