Requête hiérarchique [PostgreSQL] - SQL/NoSQL - Programmation
Marsh Posté le 09-03-2021 à 07:54:48
Désolé de répondre si tard.
Mais ça ne me viendrait pas à l'idée de faire ça dans une BD relationnelle.
Il y a un type de BD spécifique pour ce genre de problème, les bases de données orientées graphes comme Neo4J.
Votre problème est spécifiquement mentionné comme un des cas d'utilisation de ce type de BD:
https://www.smalsresearch.be/sept-b [...] -database/
Si vous voulez faire une structure d'arbre en SQL, j'ai du code pour ça, mais à mon avis ça ne résoudra pas votre problème. Pour cela, il faut soit un truc comme Neo4J, soit résoudre le problème de façon programmatique, càd dans un "vrai" langage, et pas en SQL, qui n'est pas fait pour ça.
Postgres permet de faire tourner du code en interne via un langage de votre choix pour résoudre ce type de problème, mais le SQL n'est pas la solution.
Marsh Posté le 09-03-2021 à 09:11:33
Merci pour la réponse
Ce n'est pas celle que j’espérai mais elle donne des pistes. Merci
Marsh Posté le 03-01-2021 à 18:50:31
J'ai une base de donnée représentant un schéma de câblage :
Table "t_cable"
Column | Type | Collation | Nullable | Default
-------------+-----------------------------+-----------+----------+---------
c_code | character varying(254) | | not null |
c_batiment | character varying(254) | | |
c_color | character varying(10) | | |
Chaque branchement est défini par :
Table "t_cablage"
Column | Type | Collation | Nullable | Default
------------+-----------------------------+-----------+----------+---------
ps_code | character varying(254) | | not null |
ps_1 | character varying(254) | | |
ps_2 | character varying(254) | | |
ps_1 et ps_2 sont issus de c_code
Par exemple :
ps_code | ps_1 | ps_2
-----------+--------+-------+
br1 | bleu |
br2 | orange |
br3 | | violet
br4 | vert |
br5 | bleu | jaune
br6 | vert | rouge
br7 | orange | violet
br8 | rouge | jaune
(La valeur null indique que le câble est actif / branché sur un équipement)
Je cherche à suivre une connexion de son origine à son extrémité. Donc, pour le câble jaune, avec le tableau ci-dessus :
(équipement) <-> bleu <-> jaune <-> rouge <-> vert <-> (équipement)
J'utilise cette requête pour sortir la liste des câbles reliés au câble jaune :
WITH RECURSIVE subordinates AS (
SELECT
ps_1,
ps_2
FROM
t_cablage
WHERE
ps_1 = 'jaune' OR
ps_2 = 'jaune'
UNION
SELECT
po.ps_1,
po.ps_2
FROM
t_cablage ca
INNER JOIN subordinates s ON s.ps_1 = ca.ps_1
OR s.ps_1 = ca.ps_2
OR s.ps_2 = ca.ps_2
OR s.ps_2 = ca.ps_1)
SELECT * FROM subordinates;
Mon problème est que ça ne me sort pas le cheminement.
Le problème pourrait être simple si j'avais ps_1 et ps_2 avec une relation parent->enfant à sens unique mais ce n'est pas le cas (le parent peut être ps_1 ou ps_2)
Existe-t-il une requête permettant de sortir le cheminement en partant d'une extrémité et prenant en entrée un câble participant à la liaison ?