Bonjour,

J'utilise la version 11 de postgresql.

Je veux obtenir la liste des collèges dont le parentid est nul et pour chacun obtenir la liste de tous ses enfants avec toutes les informations (identifiant, nom et numéro préféré).

ce qui signifie par exemple si on a 3 collèges avec parentid null comme celui-ci

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
college1 :  (id : B1  , name : college1 , favoriteNbr: 1 )
 college2  : (id : B2  , name : college2 , favoriteNbr: 8 )
 college3 :  (id : B3 , name : college3 , favoriteNbr: 5 )
et si collège 1 a deux enfants et collège 2 a un enfant et collège 3 a trois enfants
le résultat final devrai être comme celle ci

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
B1,college1,1  -->  B01,college01,0 --> B001,college001,1
B2,college2,8  -->  B02,college02,3
B3,college3,5  -->  B03,college03,1 --> B003,college003,4 --> B0003,college0003,1

seulement 3 lignes (le college qui a le parent null c'est a dire niveau 1 avec tous ces enfants)

J'essaie avec cette requête sans succès


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
with recursive nodes as    (
 select college.id AS value, CAST(collegeL.name  AS varchar) AS text,cast (ARRAY[college.id,collegeL.name,
 cast((select count(*) from favorite fav where fav.id_college_favorite = college.id and fav.id_emp = 'EM-1') as varchar(10) )] as TEXT )
 as parents,college.app_order,
cast((select count(*) from favorite fav where fav.id_college_favorite = college.id and fav.id_emp = 'EM-1') as varchar(10) ) as favoriteNbr
 
 FROM public.college college  
 LEFT OUTER JOIN public.collegeLang collegeL ON collegeL.college_id = college.id
 Where college.status ='1' and parentid is null and college.categ ='C' 
 
 
 
 union all  
 
 select o.id AS value, CAST(collegeL.name  AS varchar)   AS text ,parents || '->' ||  cast (ARRAY[o.id,collegeL.name,
  cast((select count(*) from favorite fav where fav.id_college_favorite = o.id and fav.id_emp = 'EM-1') as varchar(10) )] as TEXT ),o.app_order  ,
     cast((select count(*) from favorite fav where fav.id_college_favorite = o.id and fav.id_emp = 'EM-1') as varchar(10) ) as favoriteNbr
 
 FROM college o  
  join nodes n on n.value = o.parentid  
  LEFT OUTER JOIN collegeLang collegeL ON collegeL.college_id = o.id 
  where o.status ='1' and o.categ !='M'
 
 
 
 )  
 select  CAST(text  AS varchar) as text,value as value, parents as children,favoriteNbr from nodes  
 order by app_order asc
cette requête affiche tous les collèges (9 collèges) et affiche pour chacun le chemin comme celui-ci


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
B1,college1,1                 B1,college1,1
B2,college2,8                 B2,college2,8
B3,college3,5                 B3,college3,5
B01,college01,0               B1,college1,1  -->  B01,college01,0
B02,college02,3               B2,college2,8  -->  B02,college02,3
B03,college03,1               B3,college3,5 -->   B03,college03,1
B001,college001,1             B1,college1,1 -->   B01,college01,0   -->   B001,college001,1
B003,college003,4             B3,college3,5  -->  B03,college03,1  -->   B003,college003,4
B0003,college0003,1           B3,college3,5  -->  B03,college03,1  -->   B003,college003,4   --> B0003,college0003,1
merci d'avance pour vos aides