Salut à toutes et à tous !
J'ai un algorithme assez complexe que je n'arrive pas à résoudre, je m'explique en simplifiant :
J'ai trois tables :
tab_maj (id, name)
tab_link (id_maj, id_loc, type)
id_maj pointe sur id de tab_maj
id_loc pointe sur id de tab_loc
tab_loc (id, name, id_parent)
id_parent pointe sur id de tab_loc
Je cherche à récupérer une ligne tel que :
tab_maj.id, tab_maj.name, tab_loc.id, tab_loc.name
Mais là où tous ce complique c'est que en fonction de la valeur du champ tab_link.type (qui est un booléen), j'ai un traitement différent à faire :
Si type est à false, on retourne la ligne telle quelle
Si type est à true, on ne retourne pas une ligne mais X ligne en fonction des fils du tab_loc.id que l'on a
Exemple :
Je récupère :
tab_maj.id, tab_maj.name, tab_loc.id, tab_loc.name, tab_link.type
1 'Test1', 5, 'Paris 13', false
2 'Test2', 10 'Lyon', true
Dans ce cas là, on récupère la première ligne telle quelle car le type est à false.
Mais pour la deuxième ligne, on ne la retourne pas elle même car le type est à true; on retourne autant de ligne que le nombre de fils de la ville.
C'est à dire que pour la ville de Lyon qui est d'ID 10, on va récupérer toutes les autres villes qui l'ont en tant que parent_id et cela de façon récursive afin de récupérer tous ses descendants (ses fils, les fils de ses fils, etc...).
Donc, si la ville de Lyon a 3 fils qui ont chacun 2 fils, j'ai un total de 6 lignes à retourner.
Et surtout, je ne retourne pas la ligne initial qui correspond à la ville de Lyon !
Je précise que tout ceci est sous PostgreSQL dans une fonction.
J'ai tenté un CASE sur le INNER JOIN entre tab_link et tab_loc avec une condition sur le type mais cela ne fonctionne pas ou je m'y prend mal.
Dans le cas où le type est à false, je fais la jointure habituelle sinon j'utilise WITH RECURSIVE cte AS () pour récupérer tous les fils de la ville mais la requête refuse que je lui donne plusieurs résultats.
J'espère avoir été assez compréhensible, n'hésitez pas à me poser des questions !
Merci d'avance pour vos réponses !
Partager