Bonjour,

Je dispose de deux tables :
- arbo
- travaux

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
CREATE TABLE `arbo` (
  `pere` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `fils` varchar(20) COLLATE utf8mb4_general_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
 
 
INSERT INTO `arbo` VALUES('LI1', 'TR1');
INSERT INTO `arbo` VALUES('LI2', 'TR2');
INSERT INTO `arbo` VALUES('LI2', 'TR3');
INSERT INTO `arbo` VALUES('LI3', 'TR4');
INSERT INTO `arbo` VALUES('LI3', 'TR5');
INSERT INTO `arbo` VALUES('TR1', 'VO1');
INSERT INTO `arbo` VALUES('TR1', 'VO2');
INSERT INTO `arbo` VALUES('TR1', 'VO3');
INSERT INTO `arbo` VALUES('TR2', 'VO4');
INSERT INTO `arbo` VALUES('TR2', 'VO5');
INSERT INTO `arbo` VALUES('TR2', 'VO6');
INSERT INTO `arbo` VALUES('TR3', 'VO7');
INSERT INTO `arbo` VALUES('TR3', 'VO8');
INSERT INTO `arbo` VALUES('TR3', 'VO9');
INSERT INTO `arbo` VALUES('TR4', 'VO10');
INSERT INTO `arbo` VALUES('TR4', 'VO11');
INSERT INTO `arbo` VALUES('TR4', 'VO12');
INSERT INTO `arbo` VALUES('TR5', 'VO13');
INSERT INTO `arbo` VALUES('TR5', 'VO14');
INSERT INTO `arbo` VALUES('TR5', 'VO15');
INSERT INTO `arbo` VALUES('VO1', 'EQ1');
INSERT INTO `arbo` VALUES('VO1', 'EQ2');
INSERT INTO `arbo` VALUES('VO2', 'EQ3');
INSERT INTO `arbo` VALUES('VO3', 'EQ4');
INSERT INTO `arbo` VALUES('VO3', 'EQ5');
INSERT INTO `arbo` VALUES('VO4', 'EQ6');
INSERT INTO `arbo` VALUES('VO4', 'EQ7');
INSERT INTO `arbo` VALUES('VO5', 'EQ8');
INSERT INTO `arbo` VALUES('VO5', 'EQ9');
INSERT INTO `arbo` VALUES('VO6', 'EQ10');
INSERT INTO `arbo` VALUES('VO7', 'EQ11');
INSERT INTO `arbo` VALUES('VO7', 'EQ12');
INSERT INTO `arbo` VALUES('VO8', 'EQ13');
INSERT INTO `arbo` VALUES('VO8', 'EQ14');
INSERT INTO `arbo` VALUES('VO9', 'EQ15');
INSERT INTO `arbo` VALUES('VO10', 'EQ16');
INSERT INTO `arbo` VALUES('VO10', 'EQ17');
INSERT INTO `arbo` VALUES('VO11', 'EQ18');
INSERT INTO `arbo` VALUES('VO12', 'EQ19');
INSERT INTO `arbo` VALUES('VO13', 'EQ20');
INSERT INTO `arbo` VALUES('VO15', 'EQ21');
 
CREATE TABLE `travaux` (
  `id` int NOT NULL,
  `equipement_id` varchar(20) COLLATE utf8mb4_general_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
 
INSERT INTO `travaux` VALUES(15, 'EQ1');
INSERT INTO `travaux` VALUES(19, 'EQ10');
INSERT INTO `travaux` VALUES(23, 'EQ11');
INSERT INTO `travaux` VALUES(21, 'EQ16');
INSERT INTO `travaux` VALUES(26, 'EQ18');
INSERT INTO `travaux` VALUES(16, 'EQ2');
INSERT INTO `travaux` VALUES(22, 'EQ3');
INSERT INTO `travaux` VALUES(18, 'TR1');
INSERT INTO `travaux` VALUES(27, 'TR2');
INSERT INTO `travaux` VALUES(20, 'TR5');
INSERT INTO `travaux` VALUES(28, 'VO11');
INSERT INTO `travaux` VALUES(24, 'VO14');
INSERT INTO `travaux` VALUES(25, 'VO15');
INSERT INTO `travaux` VALUES(17, 'VO3');
La première table "arbo" contient une arborescence qui peut aller d'un niveau à une dizaine de niveaux.

Une seconde table "travaux" qui contient des tâches à réaliser. La colonne "equipement_id" se retrouve soit dans la colonne "pere" soit dans la colonne "fils" de la table "arbo".

Mon but premier était de récupérer toutes les tâches de la table "travaux" dont la colonne "equipement_id" se retrouve par arborescence dans la table "arbo" avec un "pere" valant "LI1" ou "LI2". J'ai réussi à avoir ce résultat par la requête suivante :

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
 
SELECT DISTINCT
    t.*
FROM 
    travaux t
JOIN 
    (
        SELECT
        	pere,
        	fils
        FROM arbo b 
        START WITH PARENT IN ('LI1', 'LI2')
        CONNECT BY NOCYCLE 
            PRIOR fils = pere
    ) a
ON t.equipement_id = a.pere OR t.equipement_id = a.fils;
Je souhaite maintenant avoir les 2 premiers enfants à partir du plus grand père (à partir du "START WITH PARENT")

Si je devais modéliser le résultat ça ressemblerait à ça :
grand_pere fils1 fils2 equipement_id travaux_id
LI1 TR1 VO1 EQ1 15
LI1 TR1 VO1 EQ2 16
LI1 TR1 VO3 VO3 17
LI1 TR1 TR1 18
LI2 TR2 VO6 EQ10 19
LI1 TR1 VO2 EQ3 22
LI2 TR3 VO7 EQ11 23
LI1 TR2 TR2 27

Je suis preneur pour un petit coup de main, là je commence à tourner en rond