Hello,
On m'a posé une colle ce matin. Au départ, je pensais que ça allait être simple mais en fait, en traitant le problème, pas tant que ça...
Dans une table contenant des éléments d'un réseau (conduites de distribution d'eau par exemple), il y a notamment des colonnes IN_FID et OUT_FID qui contiennent les identifiants des éléments auxquels l'élément est connecté.
Voici un exemple :
Particularité aussi, les connexions se font n'importe comment. Ce n'est pas toujours OUT_FID qui pointe vers IN_FID. Ca peut être l'inverse comme ça peut pointer vers la même colonne aussi (ça dépend du sens dans lequel l'utilisateur dessine l'élément du réseau qu'on m'a dit).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 WITH A (ID, IN_FID, OUT_FID) AS ( SELECT 1, 1234, 9876 UNION ALL SELECT 2, 2345, 8765 UNION ALL SELECT 3, 3545, 1234 UNION ALL SELECT 4, 6574, 3545 ), T (ID, IN_FID, OUT_FID, LVL) AS ( SELECT ID, IN_FID, OUT_FID, 1 FROM A WHERE IN_FID = 1234 UNION ALL SELECT A.ID, A.IN_FID, A.OUT_FID, T.LVL + 1 FROM A INNER JOIN T ON A.IN_FID <> 1234 AND A.ID <> T.ID AND ( A.IN_FID = T.IN_FID OR A.IN_FID = T.OUT_FID OR A.OUT_FID = T.IN_FID OR A.OUT_FID = T.OUT_FID ) ) SELECT * FROM T
Mais avec cette requête, on a bien sûr un cycle. Il faudrait en fait pouvoir exclure une ligne qui a déjà été prise dans T.
Enfin c'est mon analyse du problème. Il y a peut-être moyen de mieux faire.
Perso, je sèche... Auriez-vous une idée ?
Partager