Bonjour,
J’aurais besoin d’un coup de main pour faire une requête hiérarchique un poil complexe.
J'ai tous les clans de géants dans une table. Un géant peut appartenir à plusieurs clans, un lien hiérarchique peut être en place ou non. C'est donné par la colonne ACTIF, si une hiérarchie s'interrompt du haut en bas, il faut interrompre la chaîne et ne pas traiter les bouts de hiérarchie orphelins (il ne faut partir que du top chef donc) :
Avec :
Code : Tout sélectionner
IDGE ACTIF IDCH IDCL
1 TRUE 2 1
2 TRUE 3 1
3 TRUE null 1
1 TRUE 4 2
3 TRUE 1 2
4 TRUE null 2
3 FALSE 5 3
5 TRUE null 3
Code : Tout sélectionner
Hiérarchie Clan
1/2/3 1
3/1/4 2
5 3
Sinon, je le fais par programmation.
Réponse :
Cela semble tout à fait possible, il faut juste que la condition de jointure père-fils de la CTE hiérarchique se fasse par clan.
Exemple :
Code : Tout sélectionner
select version();
version
----------------------------------------------------------------------------------------------------------------
PostgreSQL 11.5 (Debian 11.5-1+deb10u1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
create table geants(idge int, actif boolean, idch int, idcl int);
insert into geants(idge, actif, idch, idcl) values
(1,true,2,1),
(2,true,3,1),
(3,true,null,1),
(1,true,4,2),
(3,true,1,2),
(4,true,null,2),
(3,false,5,3),
(5,true,null,3);
WITH RECURSIVE hierarchie_clans(idge, idges, idcl, niveau)
AS
( SELECT idge, idge::text as idges, idcl, 1 FROM geants where idch is null and actif
UNION ALL
SELECT g.idge, g.idge || '/' || h.idges as idges, g.idcl, h.niveau+1 FROM hierarchie_clans AS h join geants AS g on (h.idge = g.idch and h.idcl = g.idcl and actif))
select distinct idcl as clan, first_value(idges) over (partition by idcl order by niveau desc) as hierarchie from hierarchie_clans order by idcl ;
clan | hierarchie
------+------------
1 | 1/2/3
2 | 3/1/4
3 | 5