OVH Cloud OVH Cloud

Instruction SELECT pour une Structure arborescente ??

3 réponses
Avatar
News Groups
Bonjour,

j'ai mis en place une table dont le shemas est le suivant :
REF_ELEMENT ([ELMT_ID] [int] NOT NULL ,
[ID_PARENT] [int] NOT NULL ,
[ELMT_NOM] [varchar] (50) NOT NULL)
Avec CTL_ID comme clef primaire

cette table reproduit une structure arborescente avec :
ELMT_ID : contient les ID des entités de mon arbre
ELMT_NOM : contient les Nom génériques des entités de mon arbre
ID_PARENT : contient pour une entité donnée, l'ID de l'entité parente de
niveau supérieur

contenu :
ELMT_ID ID_PARENT ELMT_NOM
-----------------------------------------
1 0 Voiture
2 1 Moteur
3 1 Carrosserie
4 2 Circuit Alimentation
5 2 Pompe à Huile
6 4 Carburateur
.....

Mon soucis est le suivant, je ne sais pas comment ecrire l'instruction SQL
qui me permet de selectionné toutes les entités se trouvant au niveau
inférieur de l'entité selectionnée ??! !!
exemple :
si je selectionne l'ID = 1 pour la "voiture" je veux avoir en retour toutes
les entités inférieures, soit : 2/3/ et 4/5/ et 6
pour ID = 2 cela doit donné : 4/5/et 6

Je sais que ce type de graphe en arborescence est traité dans le monde SQL
par des méthodes, mais je ne sais comment ?
Donc je m'en remet à vos idées et connaissance pour m'aider, ou du moins
m'aiguiller ?

Merci par avance,
Thierry.

3 réponses

Avatar
Ph. B.
News Groups wrote:

Bonjour,

j'ai mis en place une table dont le shemas est le suivant :
REF_ELEMENT ([ELMT_ID] [int] NOT NULL ,
[ID_PARENT] [int] NOT NULL ,
[ELMT_NOM] [varchar] (50) NOT NULL)
Avec CTL_ID comme clef primaire

cette table reproduit une structure arborescente avec :
ELMT_ID : contient les ID des entités de mon arbre
ELMT_NOM : contient les Nom génériques des entités de mon arbre
ID_PARENT : contient pour une entité donnée, l'ID de l'entité parente de
niveau supérieur

contenu :
ELMT_ID ID_PARENT ELMT_NOM
-----------------------------------------
1 0 Voiture
2 1 Moteur
3 1 Carrosserie
4 2 Circuit Alimentation
5 2 Pompe à Huile
6 4 Carburateur
.....

Mon soucis est le suivant, je ne sais pas comment ecrire l'instruction SQL
qui me permet de selectionné toutes les entités se trouvant au niveau
inférieur de l'entité selectionnée ??! !!
exemple :
si je selectionne l'ID = 1 pour la "voiture" je veux avoir en retour toutes
les entités inférieures, soit : 2/3/ et 4/5/ et 6
pour ID = 2 cela doit donné : 4/5/et 6

Je sais que ce type de graphe en arborescence est traité dans le monde SQL
par des méthodes, mais je ne sais comment ?
Donc je m'en remet à vos idées et connaissance pour m'aider, ou du moins
m'aiguiller ?

Merci par avance,
Thierry.



Bonjour,

L'idéal serait de "casser" la récursivité induite par ton choix de définition de
table et passer par un modèle intervallaire (la récursivité en SQL comme dans
d'autres domaines n'est pas toujours le meilleur choix, surtout si on peut le
remplacer par des méthodes itératives, et dans le cas qui t'intéresse une
méthode intervallaire).

Sur le site de Frédéric Brouard, tu trouveras la description de la méthode, ses
avantages, et un exemple d'implémentation sous MsSql server justement ! ;-)
Le lien : http://sqlpro.developpez.com/cours/arborescence/
Plus généralement: http://sqlpro.developpez.com/

--
Philippe.
Avatar
News Groups
Je viens de parcourir la page web mentionnée et effectivement cela semble
répondre parfaitement à mon cas de figure :-))

Donc merci beaucoup de ta réponse qui tape pile dans le mille ! :-)

Encore merci,
Thierry.

"Ph. B." a écrit dans le message
de news: 416652fb$0$313$
News Groups wrote:

> Bonjour,
>
> j'ai mis en place une table dont le shemas est le suivant :
> REF_ELEMENT ([ELMT_ID] [int] NOT NULL ,
> [ID_PARENT] [int] NOT NULL ,
> [ELMT_NOM] [varchar] (50) NOT NULL)
> Avec CTL_ID comme clef primaire
>
> cette table reproduit une structure arborescente avec :
> ELMT_ID : contient les ID des entités de mon arbre
> ELMT_NOM : contient les Nom génériques des entités de mon arbre
> ID_PARENT : contient pour une entité donnée, l'ID de l'entité parente de
> niveau supérieur
>
> contenu :
> ELMT_ID ID_PARENT ELMT_NOM
> -----------------------------------------
> 1 0 Voiture
> 2 1 Moteur
> 3 1 Carrosserie
> 4 2 Circuit Alimentation
> 5 2 Pompe à Huile
> 6 4 Carburateur
> .....
>
> Mon soucis est le suivant, je ne sais pas comment ecrire l'instruction


SQL
> qui me permet de selectionné toutes les entités se trouvant au niveau
> inférieur de l'entité selectionnée ??! !!
> exemple :
> si je selectionne l'ID = 1 pour la "voiture" je veux avoir en retour


toutes
> les entités inférieures, soit : 2/3/ et 4/5/ et 6
> pour ID = 2 cela doit donné : 4/5/et 6
>
> Je sais que ce type de graphe en arborescence est traité dans le monde


SQL
> par des méthodes, mais je ne sais comment ?
> Donc je m'en remet à vos idées et connaissance pour m'aider, ou du moins
> m'aiguiller ?
>
> Merci par avance,
> Thierry.

Bonjour,

L'idéal serait de "casser" la récursivité induite par ton choix de


définition de
table et passer par un modèle intervallaire (la récursivité en SQL comme


dans
d'autres domaines n'est pas toujours le meilleur choix, surtout si on peut


le
remplacer par des méthodes itératives, et dans le cas qui t'intéresse une
méthode intervallaire).

Sur le site de Frédéric Brouard, tu trouveras la description de la


méthode, ses
avantages, et un exemple d'implémentation sous MsSql server justement !


;-)
Le lien : http://sqlpro.developpez.com/cours/arborescence/
Plus généralement: http://sqlpro.developpez.com/

--
Philippe.


Avatar
Philippe [MS]
Une autre possibilité consiste à disposer d'un champ additionnel dans la
table.

ELMT_ID ID_PARENT ELMT_NOM PATH
> > -----------------------------------------
> > 1 0 Voiture


00001
> > 2 1 Moteur


00001/00002
> > 3 1 Carrosserie


00001/00003
> > 4 2 Circuit Alimentation


00001/00002/00004
> > 5 2 Pompe à Huile


00001/00002/00005
> > 6 4 Carburateur


00001/00002/00004/00006

Ce champ peut être mis à jour par le biais d'un trigger (lorsque le parent
est défini, on récupère son PATH et on concatène un '/' suivi de son ID
formaté sur n caractères (ici 5).
Il est alors simple lorsque l'on veut atteindre un noeud et ses fils exemple
le noeud 2 de faire la requete suivante :

DECLARE @MY_PATH varechar(300)
SELECT @MY_PATH = PATH FROM REF_ELEMENT WHERE ELEMT_ID = 2

SELECT * FROM REF_ELEMENT WHERE LEFT(PATH, LEN(@MY_PATH )) = @PATH ORDER BY
ELEMT_ID

Phil.

"News Groups" wrote in message
news:41666207$0$313$
Je viens de parcourir la page web mentionnée et effectivement cela semble
répondre parfaitement à mon cas de figure :-))

Donc merci beaucoup de ta réponse qui tape pile dans le mille ! :-)

Encore merci,
Thierry.

"Ph. B." a écrit dans le message
de news: 416652fb$0$313$
> News Groups wrote:
>
> > Bonjour,
> >
> > j'ai mis en place une table dont le shemas est le suivant :
> > REF_ELEMENT ([ELMT_ID] [int] NOT NULL ,
> > [ID_PARENT] [int] NOT NULL ,
> > [ELMT_NOM] [varchar] (50) NOT NULL)
> > Avec CTL_ID comme clef primaire
> >
> > cette table reproduit une structure arborescente avec :
> > ELMT_ID : contient les ID des entités de mon arbre
> > ELMT_NOM : contient les Nom génériques des entités de mon arbre
> > ID_PARENT : contient pour une entité donnée, l'ID de l'entité parente


de
> > niveau supérieur
> >
> > contenu :
> > ELMT_ID ID_PARENT ELMT_NOM
> > -----------------------------------------
> > 1 0 Voiture
> > 2 1 Moteur
> > 3 1 Carrosserie
> > 4 2 Circuit Alimentation
> > 5 2 Pompe à Huile
> > 6 4 Carburateur
> > .....
> >
> > Mon soucis est le suivant, je ne sais pas comment ecrire l'instruction
SQL
> > qui me permet de selectionné toutes les entités se trouvant au niveau
> > inférieur de l'entité selectionnée ??! !!
> > exemple :
> > si je selectionne l'ID = 1 pour la "voiture" je veux avoir en retour
toutes
> > les entités inférieures, soit : 2/3/ et 4/5/ et 6
> > pour ID = 2 cela doit donné : 4/5/et 6
> >
> > Je sais que ce type de graphe en arborescence est traité dans le monde
SQL
> > par des méthodes, mais je ne sais comment ?
> > Donc je m'en remet à vos idées et connaissance pour m'aider, ou du


moins
> > m'aiguiller ?
> >
> > Merci par avance,
> > Thierry.
>
> Bonjour,
>
> L'idéal serait de "casser" la récursivité induite par ton choix de
définition de
> table et passer par un modèle intervallaire (la récursivité en SQL comme
dans
> d'autres domaines n'est pas toujours le meilleur choix, surtout si on


peut
le
> remplacer par des méthodes itératives, et dans le cas qui t'intéresse


une
> méthode intervallaire).
>
> Sur le site de Frédéric Brouard, tu trouveras la description de la
méthode, ses
> avantages, et un exemple d'implémentation sous MsSql server justement !
;-)
> Le lien : http://sqlpro.developpez.com/cours/arborescence/
> Plus généralement: http://sqlpro.developpez.com/
>
> --
> Philippe.