[PostgreSQL] Requête hiérarchique

Requête hiérarchique [PostgreSQL] - SQL/NoSQL - Programmation

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 ?

Reply

Marsh Posté le 03-01-2021 à 18:50:31   

Reply

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.


Message édité par el muchacho le 09-03-2021 à 08:03:18

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

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 [:cerveau charlest]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed