Requête récursive

Fermé
Pretorien0 - 28 nov. 2001 à 14:32
 mgadio - 24 déc. 2001 à 12:04
Bonjour,

J'ai une table toto qui contient deux champs A et B

A B
de905 945940de
DE905 971030DE
DE905 07730301
971030DE 97103usi
97103usi 97103FON

Je souhaiterais avoir le résultat suivant

1 945940DE
1 971030DE
2 97103usi
3 97103fon
1 07730301

J'ai réussi en faisant plusieurs requêtes, à chaque fois, ma requête appelle la requête précédente et la table, ce qui fait que je peux avoir XXX requêtes.
style requete1 : SELECT 1 AS [Level], toto.A,toto.B FROM toto
requete2:SELECT 2 AS [Level], Requete1.A, toto.A, toto.B FROM Requete1 INNER JOIN toto ON Requete1.B= toto.A;
requete3:SELECT 3 AS [Level], requete2.Requete1.A, requete2.toto.A, requete2.B, toto.B FROM requete2 INNER JOIN toto ON requete2.B= toto.A;
Et ainsi de suite

Je pense qu'il est possible de regrouper tout cela et d'en faire une ou deux seulement.

Merci de pouvoir m'aider là dessus

2 réponses

en récursif tu peux obtenir
1 DE905
2 971030DE
3 97103usi
4 97103FON
2 07730301
2 945940de
au premier enregistrement prêt et en retirant 1 au level, c'est ce que tu veux

pour ça il faut ajouter un enregistrement dansl a table
A B
null DE905

et en Oracle écrire

select LEVEL, B from recuv
start with A is null
connect by prior B = A

Start donne l'enregistrment ROOT
Connect by la clause de liaison pere- fils
voila
1
Bonjour,
Tu as compris exactement ce que je souhaite obtenir, le problème, c'est que je le fais sous access, et je n'arrive pas à transformer ton sql sous access. En plus, je n'ai pas le level dans ma table, c'est à moi de le définir suivant la position du parent.
Connais tu cela dans Access 97 ?
Merci
0
ha lalalala, avec access t'es dans la m.... il va falloir écrire une procédure pour traiter la récursivité, c'est assez simple mais c'est du code et donc soumis à bug. SQL est une norme mais comme d'hab Bill ne la respecte pas et à ma connaissance il n'existe pas de requete recursive dans le SQL d'Access. Pour info LEVEL est champ caché d'Oracle.
Tu n'as besoin que d'une requete simple sur ta table et d'un algo recursif qui traite les données toujours dans le même sens (de gauche à droite par exemple) et stocke dans une autre table le résultat.
Voila, je ne peux pas d'en dire plus.
0
mgadio > GlopGlop
24 déc. 2001 à 12:04
Ecoute c'est simple.
Tu crées une table "t_level" ayant deux champs: level et B
Tu places le code suivant quelque part(où il le faut)

dim i as integer
dim db as database,rst as recordeset
dim rstlv as recordset
set db=currentdb()
set rst=db.openrecordeset("nom_table")
set rstlv=db.openrecordeset("t_level")
i=1
rst.movefirst
do while not rst.EOF
rstlv.addnew
rstlv!level=i
rstlv!B=rst!B
i=i+1
rstlv.update
rst.movenext
Loop

Ensuite tu appelles une requete rq_level
rq_level="select * from t_level"

Et le tour est joué.
0