Bonjour,
je cherche une âme généreuse pour m'éviter d'utiliser un curseur si cela est possible.....

J'ai une liste chainée d'éléments (des dossiers)
sur chaque dossier je peux avoir autant de "données" que je le souhaite
Une donnée peut être propagée dans une liste chainée: on précise alors le dossier d'origine et la génération de la donnée: nombre partant de 0 et incrémenté de 1 a chaque propagation

Exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
DOS1 ---- DOS2 ---- DOS3 ---- DOS4
   |
DAT1
O:DOS1
G:0
Ensuite, la donnée est propagée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
DOS1 ---- DOS2 ---- DOS3 ---- DOS4
   |        |        |         |
DAT1       DAT1     DAT1      DAT1
O:DOS1     O:DOS1   O:DOS1    O:DOS1
G:0        G:1      G:2       G:3
On peut évidemment avoir autant de données d'origines différentes qui souhaité:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
DOS1 ---- DOS2 ---- DOS3 ---- DOS4
 |         |         |         |
DAT1      DAT1      DAT1      DAT1
O:DOS1    O:DOS1    O:DOS1    O:DOS1
G:0       G:1       G:2       G:3
 
DAT2      DAT2      DAT2      DAT2
O:DOS8    O:DOS8    O:DOS8    O:DOS8
G:4       G:5       G:6       G:7
 
          DAT3       DAT3      DAT3
          O:DOS2     O:DOS2    O:DOS2
          G:0        G:1       G:2
J'ai ensuite une procédure qui me permet de supprimer un lien (par exemple entre DOS2 et DOS3) et je devrais donc supprimer les données propagées à partir de DOS2
Mon problème est que je n'arrive pas a faire la requête me permettant de faire cela... Il reste la solution du curseur mais je pense qu'il est possible d'éviter

Note: les liens entre les données et les dossiers sont fait avec une table
DOS_DAT

Si je veux supprimer le lien DOS2-DOS3
la requête de suppression des données serait du style

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
DELETE FROM DATA WHERE
 ORIGINE = (SELECT ORIGINE FROM DATA 
                 WHERE DOS_DAT.DOS = DOS2)
 AND GENERATION > (SELECT ORIGINE FROM DATA 
                              WHERE DOS_DAT.DOS = DOS2)
Mais la les données ORIGINE et GENERATION sont disjointes, et je ne sais pas comment faire pour dire que pour chaque donnée du dossier DOS2, il faut supprimer les données de DATA qui ont pour origine celle de la donnée du dossier 2 et une génération supérieure à celle de la donnée du dossier 2

Ouf !