Toon posts:

[sql] recursief data ophalen via (foreign) keys

Pagina: 1
Acties:

Verwijderd

Topicstarter
Stel ik heb een database met de tabellen:
categorieen
producten
producten_data

Waarbij alle drie de tabellen via FK's gekoppeld zijn. Als ik nu een categorie + producten en product data wil ophalen kan ik dat doen met losse queries, of op verschillende manieren 1 query opbouwen die de hele boel ophaalt.
Bij dit simpele voorbeeld nog wel leuk en aardig, maar bij 10 of meer relaties diep erg onpraktisch.

Is er een mogelijkheid om de FK's automatisch te laten gebruiken om de relaties te volgen? Eigenlijk op dezelfde wijze als bijv. ON DELETE acties kunnen werken.

Daarnaast heb ik ook dezelfde vraag voor een tree tabel, zoals bijvoorbeeld:
- id
- parent_id
- (data)
In dat geval kun je alles ophalen en zelf eruit zoeken wat nodig is, of een query per niveau. Maar dat lijkt me beter te moeten kunnen.

Het lijken mij twee problemen die verwant zijn, en ik kom ze erg vaak tegen. Ik kan er echter weinig info over vinden (ik weet dan ook niet de juiste benamingen ervoor)
Er zullen hiervoor vast mogelijkheden zijn. De voorkeur gaat uit naar postgre, maar andere mogelijkheden zijn ook welkom.

Verwijderd

Een query per niveau zou ik niet aanbevelen! Voor je eerste probleem moet een niet al te ingewikkelde JOIN query wel voldoen. Voor je tweede vraag kan je ook gebruik maken van één query met behulp van een FULL JOIN. Ik zelf heb in een bestaand db model hier ook eens wat voor moeten maken. Ze hadden in dat model alleen voor de tree twee tabellen gebruikt. In de ene tabel (NavMenus) stonden de menuitems en in de tweede tabel (NavRelaties) de relaties (vraag me niet waarom er twee tabellen gebruikt zijn :s) Ik heb toen met onderstaande query alles plat binnen gehaald en dit binnen ASP met een collection netjes uitgewerkt. Met de functie GetRootID() haalde ik een id op waarvandaan de tree moest worden opgebouwd... misschien kan je er wat mee...


SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT
    parent.parentID as 'parent',
    child.ChildID as 'child',
    child.Volgnr,
    resourceguid,
    nm.id,
    nm.titel,
    nm.Url
FROM 
    navMenus nm 
FULL JOIN 
    NavRelaties child 
ON 
    nm.ID = child.ParentID 
FULL JOIN 
    NavRelaties parent 
ON
    nm.ID = parent.childID 
WHERE 
    NOT (parent.parentID IS NULL) 
    OR 
    (nm.ID = '"& getRootID() &"') 
ORDER BY 
    nm.ID ASC,
    child.volgnr ASC


[edit]

voor de volledigheid hier ook maar de tabelstructuur

NavMenus
* id
* resourceguid
* titel
* url

NavRelaties
* id
* parentid
* childid
* volgnr

[ Voor 10% gewijzigd door Verwijderd op 19-07-2004 12:04 ]