Algo de recursion sur une table ? - Algo - Programmation
Marsh Posté le 28-06-2006 à 16:22:25
En sql la récursivité dépend de ton SGBD mais
bon tu peux ptet faire ça en manuel
Voici une solution peu élégante mais qui marchera ...
A Adapter ... j'ai fais ça fissa ;-)
ex :
matable
PROG. | PROJET
------+-------
PG0 | P0
PG1 | P1
PG2 | P1
PG2 | P2
PG3 | P2
PG3 | P3
PG4 | P3
insert into matemp (niv,prog, projet)
Select 0, PROG, PROJET from matable
where PROG = 'PG4'
matemp
niv , prog, projet
--------------------
0 PG4 P3
insert into matemp (niv,prog, projet)
Select 1, PROG, PROJET from matable m, matemp t
where t.projet = m.projet and t.niv = 0
matemp
niv , prog, projet
--------------------
0 PG4 P3
1 PG4 p3
1 PG3 P3
insert into matemp (niv,prog, projet)
Select 2, PROG, PROJET from matable m, matemp t
where t.prog = m.prog and t.niv = 1
matemp
niv , prog, projet
--------------------
0 PG4 P3
1 PG4 p3
1 PG3 P3
2 PG4 P3
2 PG3 P2
2 PG3 P3
etc ...
Tu vois le genre ?
à la fin
select distinct(prog) from matemp
Marsh Posté le 28-06-2006 à 18:15:16
vttman2 a écrit : [...]
select distinct(prog) from matemp |
Merci pour le proposition.
Pour le début, je vois bien, mais le "à la fin", tu le trouves comment ?
Marsh Posté le 29-06-2006 à 09:56:03
Euh la requête de la fin c'est la récolte
de tout ce que tu as récupéré précedemment
Par rapport à ton jeu d'essai tu veux quoi
exactement comme résultat ?
Marsh Posté le 29-06-2006 à 13:58:40
par rapport à mon jeu d'essai, en entrant PG4, je voudrais récupérer PG1, PG2, PG3 et PG4.
Mon problème est que j'ai du mal à voir comment parcourir le tout, et surtout comment m'arréter ?
ex.: je pars de PG4, je remonte vers le projet P3 qui me renvoit vers PG3. A partir de PG3, j'obtiens P2, mais si j'avais une ligne PG4 | P2, alors une fois dans P2, je retomberais sur PG4, avec le risque de boucler indéfiniment... Or, compte tenu du fait que la volumétrie peut-être importante, je voudrais trouver un algo qui m'évite d'avoir à vérifier tout ce qui a déjà été testé pour ne pas repasser 2 fois par le même programme...
Marsh Posté le 29-06-2006 à 14:54:05
Oui il faut introduire en + une condition
sur la table matemp (NOT IN)
pour pas reprendre ce qui a déjà été traité ...
et boucler ad Vitem
si on me lâche, j'essaierai de te pondre un exemple ;-)
Marsh Posté le 29-06-2006 à 15:59:37
merci, mais ne te fatigues pas pour l'exemple
j'esperais qu'il y'aurait une autre solution magique pour régler le problème... si je dois parcourir de tte façon toute ma table, je vais y arriver (en théorie, en pratique, cela dépendera de la volumétrie )
Marsh Posté le 29-06-2006 à 16:21:56
http://www-128.ibm.com/developerwo [...] galla.html
t'as quelle version de db2?
Marsh Posté le 29-06-2006 à 18:17:58
tiens, c'est marrant, je croyais que ce n'était possible que pour DB2 v8
'fin, de toute façon, j'ai DB2 V7.1.1 :x
Marsh Posté le 28-06-2006 à 12:38:42
Bonjour,
pour illustrer mon problème, supposons que j'ai une structure où je stocke des informations concernant des programmes et des projet. Pour chaque programme, j'ai la liste des projets dans lesquels il est utilisé.
Bon, l'exemple est bidon, mais je l'espère assez claire...
bref, au final, j'ai une structure de type:
PROG. | PROJET
------+-------
PG0 | P0
PG1 | P1
PG2 | P1
PG2 | P2
PG3 | P2
PG3 | P3
PG4 | P3
On voit bien ici que les programme PG1 est utilisé dans le projet P1 avec le programme PG2. Celui-ci est de son coté utilisé en plus dans le projet P2... etc.
J'en viens donc au but de mon algo: j'ai un super virus qui se propage dans les programmes d'un même projet... je veux donc pouvoir identifier, à partir d'une liste de programmes infectés quels sont les programmes qui vont être touchés.
Par exemple, si je suppose que le programme PG4 est infecté, il va contaminer PG3 qui est dans le même projet P3, mais PG3 étant dans P2, PG2 va être aussi contaminer etc jusqu'à PG1. Bref, seul PG0 s'en sors.
Mon but est donc de trouver la liste des programmes infectés (PG1, 2, 3 et 4) à partir de PG4.
Ca parait con comme ça (et ça l'est peut-être), mais j'ai du mal à trouver une méthode efficace pour traiter ça... pour info, l'algo doit tourner sous cobol et ma strucutre est en DB2 . Je ne peux pas utiliser de requête récursive en DB2
Mon problème est d'arriver (dans des temps de traitement raisonnable) à identifier simplement les programmes/projets par lesquels je suis déjà passé.
Je ne sais pas si c'est suffisement clair mais merci d'avance pour d'éventuelles réponses...
Message édité par lennelei le 28-06-2006 à 12:39:46