Arborescence

frbos Messages postés 27 Date d'inscription vendredi 4 novembre 2011 Statut Membre Dernière intervention 4 novembre 2011 - 23 nov. 2007 à 09:23
dsaunier Messages postés 12 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 25 novembre 2007 - 24 nov. 2007 à 10:23
Bonjour


J'ai une table contenant des "CATEGORIES" de la forme :


ID | nom_categorie | IDParent


J'ai donc des categories, sous-categories, sous-sous categories, etc...


Ces categories sont utilisees dans une table "INCIDENTS"
Est-il possible de faire une requete recuperant tous les incidents d'une categorie ET de toutes ses sous-categories ?
Merci
J'utilise MSSQL
frb

1 réponse

dsaunier Messages postés 12 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 25 novembre 2007
24 nov. 2007 à 10:23
Bonjour,
Sous Oracle (desole, je n'ai jamais utilise MSSQL), le plus simple est de cree une vue du type (categorie et 1ere sous-categorie):
CREATE VIEW CATEGORIES...suivant la syntaxe MSSQL
AS(
SELECT
C1.ID IDCAT, C2.ID , C1.NOM_CATEGORIE AS CATEGORIE, C2.NOM_CATEGORIE AS SOUS_CAT
FROM CATEGORIES C1 INNER JOIN CATEGORIES C2 ON (C2.IDPARENT=C1.ID)
WHERE C1.ID_PARENT IS NULL
UNION ALL
SELECT ID IDCAT, ID , NOM_CATEGORIE AS CATEGORIE, '' AS SOUS_CAT

FROM CATEGORIES

WHERE ID_PARENT IS NOT NULL

)
en gros, tu demande les enregistrements de C2 dont l'ID_PARENT est egal à l'ID que tu selectionne ds C1 + la categorie elle-meme si tu peux caracteriser un incident simplement par une categorie.
Ensuite, tu dois avoir une autre table INCIDENT par exemple avec une cle etrangere vers ta table categorie par ex IDCAT et donc ta requete final pour avoir tes incidents sera du type:
SELECT I.*, C.*
FROM INCIDENT I INNER JOIN CATEGORIES C ON C.ID=I.IDCAT
WHERE C.IDCAT=1

Cela doit pouvoir etre optimisable ms je n'ai pas de bdd sous la main...
A adapter en fonction de la profondeur de tes sous-cat ( ds ta vue, tu rajoute autant de left outer join sur ta table categorie que de nombre de sous-sous-sous...categorie).

A+
0
Rejoignez-nous