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 ?