Requête récursive

Pretorien0 -  
 mgadio -
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

  1. GlopGlop
     
    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
  2. Pretorien0
     
    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
    1. GlopGlop
       
      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
      1. mgadio > GlopGlop
         
        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