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 10/10/2013 09:36:36

chris0938
Membre

Requete recursive ordre des elements par rapport au parent

Bonjour,

J'ai la requete recursive suivante:

WITH recursive enfant(idEnfant,nomEnfant,parent,level) AS
(
    SELECT d.id,d.nom,d.parent,0
    FROM domaine d where d.parent is null
  union ALL
    SELECT d.id,d.nom,d.parent,e.level+1
    FROM domaine d,enfant e
    where d.parent=e.idEnfant
)
SELECT idEnfant,nomEnfant,parent,level FROM enfant;

Elle me retourne une série de domaine:

idenfant	nomenfant	parent	 level
DOM21455 	DOM1		NULL	          0
DOM45123 	DOM2		DOM21455    1 
DOM12421 	DOM3		DOM21455    1
DOM95423 	DOM4		DOM21455    1
DOM02354 	DOM5		DOM12421    2
DOM75136 	DOM6		DOM45123    2
DOM04452 	DOM7		DOM45123    2

Je souhaiterai que la requete me retourne les domaines dans l'ordre suivant :

idenfant	nomenfant	parent	 level
DOM21455 	DOM1		NULL	 0
DOM45123 	DOM2		DOM21455 1 
	DOM75136 	DOM6		DOM45123 2
	DOM04452 	DOM7		DOM45123 2
DOM12421 	DOM3		DOM21455 1
	DOM02354 	DOM5	        DOM12421 2
DOM95423 	DOM4		DOM21455 1

Ma question est la suivante : est il possible de faire cela dans la requête ?

Merci d'avance pour toutes infos.

Chris

Hors ligne

#2 10/10/2013 13:25:43

gleu
Administrateur

Re : Requete recursive ordre des elements par rapport au parent

Ce que vous voulez faire est un tri par le parent, non ?


Guillaume.

Hors ligne

#3 10/10/2013 13:43:21

chris0938
Membre

Re : Requete recursive ordre des elements par rapport au parent

Ce que je veux faire c'est récupérer la hiérarchie

Hors ligne

#4 11/10/2013 11:09:21

chris0938
Membre

Re : Requete recursive ordre des elements par rapport au parent

Bonjour,

Merci pour votre réponse.
J'y suis finalement arrivée.
Voici le résultat avec le chemin pour chacun et le nombre d'enfant

WITH RECURSIVE child AS
					(
			                SELECT d.id,d.nom,d.parent, 0 AS level, ARRAY[CAST(id AS VARCHAR)] AS path,x.noeud
			                FROM domaine d,( select d.parent,count(*) as noeud from domaine d group by d.parent)x
			                WHERE d.id='DOM87544915'
			                and x.parent=d.id
				        UNION ALL
			                SELECT d.id,d.nom,d.parent,c.level + 1 AS level, path || CAST(d.id AS VARCHAR),x.noeud
			                FROM child c JOIN domaine d ON d.parent = c.id left join ( select d.parent,count(*) as noeud from domaine d group by d.parent)x on x.parent=d.id
					)
					SELECT c.id,c.parent,c.nom,level,path,noeud
					FROM child c
					ORDER BY path

Hors ligne

Pied de page des forums