Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Débuter
Débuter Forum d'entraide : Débuter en base de données avec PostgreSQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/03/2011, 10h23   #1
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 40
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 40
Points : 27
Points : 27
Par défaut table récursivement jointe à elle-même

Bonjour,

j'ai un petit problème à vous soumettre. Soit un ensemble E d'objet représentés de façon biunivoque par des entiers, tels que chaque objet a un parent au plus ; les parents font eux-mêmes partie de E. On représente dans une table nommée 'Objets' à deux colonnes (id | parent_id) les liens de filiation entre les objets. L'objet numéroté id a comme objet parent celui représenté par parent_id. Ma question : comment récupérer, pour chaque objet, la suite d'entiers représentant ses 'aïeux' ?

J'ai une solution 'finie', en se disant, par exemple, qu'un objet n'a au plus que 2 aïeux :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
-- réplique de la table Objets
CREATE TEMPORARY VIEW objets1 AS
	SELECT id AS parent1, parent_id AS parent_parent1
		FROM Objets;
 
-- réplique de la table Objets
CREATE TEMPORARY VIEW objets2 AS
	SELECT id AS parent1, parent_id AS parent_parent2
		FROM Objets;
 
SELECT id, parent1, parent2
	FROM 
	Objets,
	objets1,
	objets2
        WHERE 
        Objets.parent_id = objets1.parent1 AND
        objets1.parent_parent1 = objets2.parent2;
Mais je me demande s'il y a plus malin et plus 'générique'... Quelqu'un aurait une idée ? Y a-t-il des fonctions "search" ou "find" qu'on puisse utiliser ? Je ne sais pas trop comment mieux prendre le problème, ne maîtrisant pas bien PostgreSQL...

Merci pour votre aide !
rstck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 11h29   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 565
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2005
Messages : 1 565
Points : 2 178
Points : 2 178
Bonjour,

vous avez besoin de récursivité ce qui ne peut se faire sans CTE (http://sqlpro.developpez.com/cours/s...te-recursives/). Postgre implémente apparemment les CTE, je vous laisse le soin de digérer la doc :

http://www.postgresql.org/docs/8.4/s...ries-with.html
vmolines est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 11h50   #3
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 40
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 40
Points : 27
Points : 27
Merci pour votre réponse ! Je me mets de suite à la lecture...
rstck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 12h40   #4
Membre confirmé
 
Homme Benjamin
Consultant informatique
Inscription : août 2007
Messages : 160
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2007
Messages : 160
Points : 248
Points : 248
A voir si ça fonctionne avec une vue, mais je ne promets rien et je n'ai pas les moyens de tester.

Code :
1
2
3
4
5
6
7
8
CREATE VIEW V_Objects_Parents (id, parent_id, level) AS
(
(SELECT o.id, o.parent_id, '1' FROM Objets o)
UNION
(SELECT o.id, v.parent_id, v.level + 1
FROM Objets o
JOIN V_Objets_Parents v ON v.id = o.parent_id)
)
bhamp0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 16h37   #5
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 40
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 40
Points : 27
Points : 27
Merci ! Votre code ne fonctionne pas avec une vue, le voilà déguisé :

Code :
1
2
3
4
5
6
7
8
9
10
 
WITH RECURSIVE V_Objects_Parents (id, parent_id, level, chem) AS
(
(SELECT o.id, o.parent_id, 1, o.name FROM Objets o)
UNION
(SELECT o.id, v.parent_id, v.level + 1, v.chem || '/' || o.name
FROM Objets o
JOIN V_Objects_Parents v ON v.id = o.parent_id)
)
SELECT * FROM V_Objects_Parents
Merci à tous les deux ! NB : la doc postgre est sybilline, mais le cours sur les CTE récursives est super didactique
rstck est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h59.


 
 
 
 
Partenaires

Hébergement Web