Fonction récursive avec multiples conditions
Bonjour, je cherche actuellement à optimiser une fonction récursive servant en gros à récupérer tout les enfants d'une table, mes compétences en sql sont pas mal limités, j'ai passé beaucoup de temps à chercher sans solution efficace donc je tente un post, pas évident pour moi à formuler clairement.
Cette table contiens les colonnes classiques pour ce genre de cas, un ID unique, et une ID_PARENT. Jusque là ça va c'est facile, on trouve plein d'exemples, mais en plus il existe aussi deux autres colonnes contenant éventuellement une liste d'ids correspondant à une liste d'enfants (de type VARCHAR, les ids sont séparés par les virgules).
Actuellement, c'est une fonction php récursive qui fait le boulot, en faisant une nouvelle requête à itération.
Je cherche à faire le faire si possible en une seule requête, ou en tout cas améliorer autant que possible les performances.
Déjà me doutant bien que celle liste d'id sous forme de chaine charactère va forcément poser problème alors j'ai créé des tables de correspondance avec deux colonnes, une avec l'id du parent, et une avec celle de l'enfant.
La table S_WO_BILANS contiens les colonnes ID_WO et ID_WO_PARENT, la table S_WO_BILANS_PROD les colonnes ID_WO et ID_WO_ENFANT
Un exemple de que j'ai essayé et qui me semblait pas mal sur le principe :
Code:
1 2 3 4 5 6 7 8 9
|
WITH wob_tree (ID_WO, ID_WO_PARENT, lvl) AS
(
SELECT ID_WO, ID_WO_PARENT, 0 AS lvl FROM S_WO_BILANS WHERE ID_WO = 399852
UNION ALL SELECT wobn.ID_WO, wobn.ID_WO_PARENT, lvl+1
FROM S_WO_BILANS wobn, wob_tree wobt WHERE wobn.ID_WO_PARENT = wobt.ID_WO
/*OR wobn.ID_WO IN (SELECT wobp.ID_WO_ENFANT FROM S_WO_BILANS_PROD wobp WHERE wobp.ID_WO = wobt.ID_WO)*/
)
SELECT * FROM wob_tree |
Dès que je rajoute la seconde condition permettant d'associer des enfants à un parent, la requête coince (boucle infinie ?)
Donc voilà je ne suis peut-être même pas sur la bonne voie, si des experts du SQL pourraient me donner une piste ce serait super, merci.