[SQL] Overzicht van een afdeling en onderafdeling

Pagina: 1
Acties:

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 00:13
Info vooraf:

Een tabel AFDELING is als volgt gedefinieerd:

int AfdelingID //Unieke sleutel
int Omschrijving
int ParentID //Sleutel van de bovenliggende afdeling

De ParentID van een afdeling hoeft dus niet altijd ingevuld staan, de directie hoeft zich tegenover niemand te verantwoorden. :)

Middels SQL wil ik door een input van een afdelingID de gegevens van het desbetreffende afdeling EN de onderliggende afdeling terugkrijgen. Zelf heb ik de volgende query:

code:
1
SELECT * FROM Afdeling WHERE AfdelingID = 1 OR ParentID = 1


Probleem is dat ik alleen de eerste onderliggende laag te zien krijg. Bijvoorbeeld:
Afdeling1 is hoofd van Afdeling2
Afdeling2 is hoofd van Afdeling3
Afdeling3 is hoofd van Afdeling4
In mijn voorbeeld krijg ik door de query alleen Afdeling1 en Afdeling2 terug. Echter: Afdeling1 is indirect ook hoofd van Afdeling3 en Afdeling4. Hoe kan ik deze informatie terugkrijgen?

  • rickmans
  • Registratie: Juli 2001
  • Niet online

rickmans

twittert

SELECT * FROM Afdeling WHERE AfdelingID = 1 OR (ParentID = 1 OR ParentID = 2 OR ParentID = 3) volgens mij kan zo :)

Don't mind Rick


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
nogal wiedes, maar erg algemeen is dat niet.

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 00:13
rickmans schreef op 29 augustus 2002 @ 08:57:
SELECT * FROM Afdeling WHERE AfdelingID = 1 OR (ParentID = 1 OR ParentID = 2 OR ParentID = 3) volgens mij kan zo :)
Voor dit voorbeeld zou jouw query wel gelden, maar ik wil een algemene query maken zonder dat ik weet hoeveel afdelingen binnen een bedrijf zijn geregistreerd.

  • rickmans
  • Registratie: Juli 2001
  • Niet online

rickmans

twittert

TweakersOnly schreef op 29 augustus 2002 @ 09:00:
[...]

Voor dit voorbeeld zou jouw query wel gelden, maar ik wil een algemene query maken zonder dat ik weet hoeveel afdelingen binnen een bedrijf zijn geregistreerd.
Ik denk dat je dan kan werken met een loopje en zo :)

Don't mind Rick


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Op basis van je huidige tabel is dit niet met één SQL statement op te lossen. Je zult in dit geval recursie moeten toepassen.
Een alternatief is om een extra veld op te nemen in de tabel waarin je info over de bovenliggende afdelingen opneemt.

Even een voorbeelde ter verduidelijking:

Afd 1: 1||
Afd 2: 1||2||
Afd 3: 1||2||3||
Afd 4: 1||2||4||

Als je nu afdeling 1 met alle onderliggende niveau's wilt hebben hoef je dus alleen maar de volgende filter toe te voegen: WHERE (column_name LIKE '1||%')

Never underestimate the power of


Verwijderd

2 manieren:

1) via nested sets. Ene meneer Joe Celko heeft hier een boek over geschreven en een basic idee omtrent nested sets is hier te vinden:
http://groups.google.com/...posting.google.com&rnum=3

zoek ook op google omtrent CELKO en 'nested sets'.

2) via precalculated parent-child sets. Dit is een methode die ikzelf heb bedacht (maar anderen zullen dat ongetwijfeld ook hebben gedaan) en die is gebaseerd op het feit dat je op het moment dat je een relatie toevoegd aan je parent-child table, je ook de hierarchie weet, en die dus kunt opslaan. Vroeger, toen ik nog hobbiede ;), programmeerde ik veel grafische demos en keyword in de demoscene was: "precalc". Aldus doe je hier ook:

Je maakt een aparte tabel waar je alle parents van een zekere child opslaat:
ChildID, int
PossibleParentIDInPath, int

Heb je bv:
childparent
1NULL
21
31
42
53
62


dan sla je in je precalc table op:
ChildIDPossibleParentIDInPath
10
20
21
30
31
42
41
40
53
51
50
62
61
60


Hier kun je een 1 shot query op loslaten, die meteen je hierarchie ophoest. Zodra de hierarchie WIJZIGT, muteer je ook je precalc tabel. Dit doe je in een storedprocedure die in een serialized transaction de tabel muteert. (dus geen andere transactions mogen op dat moment de tabel muteren).

Beide oplossingen hebben nadelen, het is aan jou om af te wegen welke nadelen voor jou het zwaarst wegen (optie 1) heeft als nadeel dat updates van de hierarchie met veel nodes erg lang kan duren).

Wat Celko goed doorheeft is dat SQL een setbased language is, en jouw structuur, hoe common ook, zich niet leent voor een set-based benadering.
Pagina: 1