PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 25/09/2016 17:42:50

Mint
Membre

Requête WITH RECURSIVE et ordre naturel des résultats

Bonjour,

J'ai besoin de pouvoir reconstituer un arbre afin de pouvoir passer dans l'ordre hiérarchique d'une branche à l'autre. Chaque branche dans la table à un niveau et un ordre dans ce niveau. J'arrive à reconstituer l'arbre mais je n'arrive pas à ordonner les résultats de tel sorte que je puisse identifier par rapport à une branche donnée la branche précédente et la suivante car les chemins reconstitués par la requête ne sont pas classé dans un ordre naturel.

Cela donne l'ordre suivant:

branche A: 1.1.2.2.6.3.2.4.1.5.3.6.2.7.3.8.5.12
branche B: 1.1.2.2.6.3.2.4.1.5.3.6.2.7.3.8.5.9
branche C: 1.1.2.2.6.3.2.4.1.5.3.6.2.7.3.8.6.2

Je cherche la branche suivante par rapport à la branche B, la requête devrait me donner A mais me retourne C.

Ma requête est la suivante:



WITH RECURSIVE tree AS
(SELECT id_texte, id_type, path, id_parent, etat, 1 AS distance, CAST(path AS text) AS fullpath
FROM arborescence
WHERE id_parent='(null)' AND id_texte='6070633'
UNION ALL
SELECT si.id_texte,si.id_type,si.path,si.id_parent,si.etat,distance+1,
    CAST(sp.fullpath || '.' || si.path AS text) AS fullpath
FROM arborescence AS si
    INNER JOIN tree AS sp
    ON (si.id_parent = sp.id_texte)
)
SELECT * FROM (SELECT *, lag(id_texte, 1) OVER (ORDER BY fullpath ASC) AS precedent, lead(id_texte,1) OVER (ORDER BY fullpath ASC) AS suivant FROM tree WHERE (id_type='ART' AND etat='V') ) AS foo WHERE id_texte='6421555'



J'ai lu ce que j'ai trouvé sur Postgresql et l'ordre naturel pour sortir les résultats mais je n'ai pas trouvé de solution par rapport au chemin de mes branches.

Est-ce que l'un d'entre vous aurait un suggestion pour me permettre d'y arriver ?

Merci par avance.

Hors ligne

#2 25/09/2016 18:12:41

rjuju
Administrateur

Re : Requête WITH RECURSIVE et ordre naturel des résultats

Sans le schéma est les données c'est un peu difficile, mais à priori vous devriez pouvoir ordonner le résultat final en fonction de votre colonne distance. Ou alors il y a un autre problème ?

Hors ligne

#3 25/09/2016 18:31:30

Mint
Membre

Re : Requête WITH RECURSIVE et ordre naturel des résultats

Désolé ce n'est pas la bonne version de la requête que j'ai posté, celle que j'ai posté c'était un essai pour ajouter un numero unique à chaque ligne retourné par la requête mais sans succès car dans la colonne distance ajoutée j'avais plusieurs lignes avec le même numéro de distance, et non pas un numéro unique. De plus je ne pense pas que la requête permette de donner un numéro unique à chaque ligne dans le bon ordre.

Par exemple au niveau 1 je peux avoir 4 branches, donc dans la table j'ai le champ path avec les valeurs 1.1 1.2 1.3 1.4 avec le même parent pour les 4. Je ne pense pas que pour construire l'arbre la requête retourne d'abord 1.1 et non 1.4 par exemple, raison pour laquelle j'ai arrêté d'essayer de donner un numéro unique  à chaque ligne (ce qui serait sans doute plus rapide que de reconstruire le chemin).

Voici la bonne requête et le schéma de la table:

WITH RECURSIVE tree AS
(SELECT id_texte, id_type, path, id_parent, etat, CAST(path AS text) AS fullpath
FROM arborescence
WHERE id_parent='(null)' AND id_texte='6070633'
UNION ALL
SELECT si.id_texte,si.id_type,si.path,si.id_parent,si.etat,
    CAST(sp.fullpath || '.' || si.path AS text) AS fullpath
FROM arborescence AS si
    INNER JOIN tree AS sp
    ON (si.id_parent = sp.id_texte)
)
SELECT * FROM (SELECT *, lag(id_texte, 1) OVER (ORDER BY fullpath ASC) AS precedent, lead(id_texte,1) OVER (ORDER BY fullpath ASC) AS suivant FROM tree WHERE (id_type='ART' AND etat='V') ) AS foo WHERE id_texte='6421555'

Schéma:

  id_parent text,
  id_texte text,
  id_type text,
  id_origine text,
  etat text,
  path text

Hors ligne

#4 26/09/2016 10:47:50

rjuju
Administrateur

Re : Requête WITH RECURSIVE et ordre naturel des résultats

Si vous pouvez avoir plusieurs enregistrement à un même niveau de profondeur d'arbre, il  vous faut une autre colonne pour ordonner ces lignes. À vous de voir selon votre besoin quelle information fait sens pour ce tri.

Hors ligne

Pied de page des forums